项目实战-角色列表

抄上一次写过的代码:

javascript 复制代码
import React, { useState, useEffect } from "react";
import axios from 'axios';
import { Button, Table, Modal } from 'antd';
import { BarsOutlined, DeleteOutlined, ExclamationCircleOutlined } from '@ant-design/icons';

const { confirm } = Modal;

function RoleList() {
    const [dataSource, setdataSource] = useState([]);

    useEffect(() => {
        axios.get('http://localhost:3000/roles').then(res => {
            setdataSource(res.data);
        });
    }, []);

    const confirmMethod = (record) => {
        confirm({
            title: '确定要删除这个角色吗?',
            icon: <ExclamationCircleOutlined />,
            onOk() {
                deleteMethod(record);
            },
            onCancel() {
                console.log('取消删除');
            },
        });
    };

    const deleteMethod = (record) => {
        // 先更新本地状态
        setdataSource(dataSource.filter(item => item.id !== record.id));
        // 发送删除请求
        axios.delete(`http://localhost:3000/roles/${record.id}`);
    };

    const columns = [
        {
            title: 'ID',
            dataIndex: 'id',
            render: (id) => <b>{id}</b>,
        },
        {
            title: '角色名称',
            dataIndex: 'roleName',
        },
        {
            title: "操作",
            render: (item) => (
                <div>
                    <Button type="primary" shape="circle" icon={<BarsOutlined />} />
                    <Button 
                        danger 
                        type="primary" 
                        shape="circle" 
                        icon={<DeleteOutlined />} 
                        onClick={() => confirmMethod(item)}
                    />
                </div>
            ),
        }
    ];

    return (
        <div>
            <Table 
                dataSource={dataSource} 
                columns={columns} 
                rowKey={(item) => item.id} 
            />
        </div>
    );
}

export default RoleList;

就可以实现一个和后端数据也可以同步的功能了:

我们需要用到树形控件:

还要实现这个弹出框的效果

javascript 复制代码
import React, { useState, useEffect } from "react";
import axios from 'axios';
import { Button, Table, Modal } from 'antd';
import { BarsOutlined, DeleteOutlined, ExclamationCircleOutlined } from '@ant-design/icons';

const { confirm } = Modal;

function RoleList() {
    const [dataSource, setdataSource] = useState([]);
    const [isModalVisible, setIsModalVisible] = useState(false);

    useEffect(() => {
        axios.get('http://localhost:3000/roles').then(res => {
            setdataSource(res.data);
        });
    }, []);

    const confirmMethod = (record) => {
        confirm({
            title: '确定要删除这个角色吗?',
            icon: <ExclamationCircleOutlined />,
            onOk() {
                deleteMethod(record);
            },
            onCancel() {
                console.log('取消删除');
            },
        });
    };

    const deleteMethod = (record) => {
        setdataSource(dataSource.filter(item => item.id !== record.id));
        axios.delete(`http://localhost:3000/roles/${record.id}`);
    };

    const showModal = () => {
        setIsModalVisible(true);
    };

    const handleOk = () => {
        console.log("点击了确认");
        setIsModalVisible(false);
    };

    const handleCancel = () => {
        console.log("点击了取消");
        setIsModalVisible(false);
    };

    const columns = [
        {
            title: 'ID',
            dataIndex: 'id',
            render: (id) => <b>{id}</b>,
        },
        {
            title: '角色名称',
            dataIndex: 'roleName',
        },
        {
            title: "操作",
            render: (item) => (
                <div>
                    <Button type="primary" shape="circle" icon={<BarsOutlined />} onClick={showModal} />
                    <Button 
                        danger 
                        type="primary" 
                        shape="circle" 
                        icon={<DeleteOutlined />} 
                        onClick={() => confirmMethod(item)}
                    />
                </div>
            ),
        }
    ];

    return (
        <div>
            <Table 
                dataSource={dataSource} 
                columns={columns} 
                rowKey={(item) => item.id} 
            />
            {/* Modal 组件 */}
            <Modal 
                title="权限分配" 
                open={isModalVisible} 
                onOk={handleOk} 
                onCancel={handleCancel}
            >
                <p>这里可以放权限分配的内容</p>
                <p>比如角色权限列表</p>
                <p>或者其他选项</p>
            </Modal>
        </div>
    );
}

export default RoleList;

能显示modal对话框,下一步实现树形结构

tree的使用就是引入一个tree组件,然后数据满足树形结构

这太棒了

javascript 复制代码
import React, { useState, useEffect } from 'react'
import axios from 'axios'
import { Button, Table, Modal,Tree } from 'antd'
import {
  BarsOutlined,
  DeleteOutlined,
  ExclamationCircleOutlined,
} from '@ant-design/icons'

const { confirm } = Modal

function RoleList() {
  const [dataSource, setdataSource] = useState([])
  const [isModalVisible, setIsModalVisible] = useState(false)
  const [rightList, setRightList] = useState([])

  useEffect(() => {
    axios.get('http://localhost:3000/roles').then((res) => {
      setdataSource(res.data)
    })
  }, [])

  useEffect(() => {
    axios.get('http://localhost:3000/rights?_embed=children').then((res) => {
      setRightList(res.data)
    })
  }, [])

  const confirmMethod = (record) => {
    confirm({
      title: '确定要删除这个角色吗?',
      icon: <ExclamationCircleOutlined />,
      onOk() {
        deleteMethod(record)
      },
      onCancel() {
        console.log('取消删除')
      },
    })
  }

  const deleteMethod = (record) => {
    setdataSource(dataSource.filter((item) => item.id !== record.id))
    axios.delete(`http://localhost:3000/roles/${record.id}`)
  }

  const showModal = () => {
    setIsModalVisible(true)
  }

  const handleOk = () => {
    console.log('点击了确认')
    setIsModalVisible(false)
  }

  const handleCancel = () => {
    console.log('点击了取消')
    setIsModalVisible(false)
  }

  const columns = [
    {
      title: 'ID',
      dataIndex: 'id',
      render: (id) => <b>{id}</b>,
    },
    {
      title: '角色名称',
      dataIndex: 'roleName',
    },
    {
      title: '操作',
      render: (item) => (
        <div>
          <Button
            type="primary"
            shape="circle"
            icon={<BarsOutlined />}
            onClick={showModal}
          />
          <Button
            danger
            type="primary"
            shape="circle"
            icon={<DeleteOutlined />}
            onClick={() => confirmMethod(item)}
          />
        </div>
      ),
    },
  ]

  return (
    <div>
      <Table
        dataSource={dataSource}
        columns={columns}
        rowKey={(item) => item.id}
      />
      {/* Modal 组件 */}
      <Modal
        title="权限分配"
        open={isModalVisible}
        onOk={handleOk}
        onCancel={handleCancel}
      >
        <Tree
          checkable treeData={rightList}/>
      </Modal>
    </div>
  )
}

export default RoleList

此后想要实现页面同步和后端的同步:

javascript 复制代码
import React, { useState, useEffect } from 'react'
import axios from 'axios'
import { Button, Table, Modal,Tree } from 'antd'
import {
  BarsOutlined,
  DeleteOutlined,
  ExclamationCircleOutlined,
} from '@ant-design/icons'

const { confirm } = Modal

function RoleList() {
  const [dataSource, setdataSource] = useState([])
  const [isModalVisible, setIsModalVisible] = useState(false)
  const [rightList, setRightList] = useState([])
  //默认选中
  const [currentRights, setCurrentRights] = useState([])
  const [currentId,setCurrentId] = useState(0)

  useEffect(() => {
    axios.get('http://localhost:3000/roles').then((res) => {
      setdataSource(res.data)
    })
  }, [])

  useEffect(() => {
    axios.get('http://localhost:3000/rights?_embed=children').then((res) => {
      setRightList(res.data)
    })
  }, [])

  const confirmMethod = (record) => {
    confirm({
      title: '确定要删除这个角色吗?',
      icon: <ExclamationCircleOutlined />,
      onOk() {
        deleteMethod(record)
      },
      onCancel() {
        console.log('取消删除')
      },
    })
  }

  const deleteMethod = (record) => {
    setdataSource(dataSource.filter((item) => item.id !== record.id))
    axios.delete(`http://localhost:3000/roles/${record.id}`)
  }

  const showModal = () => {
    setIsModalVisible(true)
    //dataSource重新映射
  }

  const handleOk = () => {
    console.log('点击了确认')
    setIsModalVisible(false)
    setdataSource(dataSource.map(item=>{
        if(item.id === currentId){
            return{
                ...item,
                rights:currentRights
            }
        }
        else{
            return item
        }
    }))
    //patch
    axios.patch(`http://localhost:3000/roles/${currentId}`,{
        rights:currentRights
    })
  }

  const handleCancel = () => {
    console.log('点击了取消')
    setIsModalVisible(false)
  }

  // 选中的权限
  const onCheck = (checkedKeys, checkedInfo) => {
    setCurrentRights(checkedKeys)
  }

  const columns = [
    {
      title: 'ID',
      dataIndex: 'id',
      render: (id) => <b>{id}</b>,
    },
    {
      title: '角色名称',
      dataIndex: 'roleName',
    },
    {
      title: '操作',
      render: (item) => (
        <div>
          <Button
            type="primary"
            shape="circle"
            icon={<BarsOutlined />}
            onClick={()=>{
                setIsModalVisible(true)
                setCurrentRights(item.rights)
                setCurrentId(item.id)
            }}
          />
          <Button
            danger
            type="primary"
            shape="circle"
            icon={<DeleteOutlined />}
            onClick={() => confirmMethod(item)}
          />
        </div>
      ),
    },
  ]

  return (
    <div>
      <Table
        dataSource={dataSource}
        columns={columns}
        rowKey={(item) => item.id}
      />
      {/* Modal 组件 */}
      <Modal
        title="权限分配"
        open={isModalVisible}
        onOk={handleOk}
        onCancel={handleCancel}
      >
        <Tree
          checkable 
          treeData={rightList}
          checkedKeys={currentRights}
          checkStrictly = {true} 
          onCheck={onCheck}
          />
      </Modal>
    </div>
  )
}

export default RoleList
相关推荐
逆袭的小黄鸭1 分钟前
理解 JavaScript 的 this:核心概念、常见误区与改变指向的方法
前端·javascript·面试
lemonzoey6 分钟前
用Web Worker优化大文件上传——告别页面卡顿!
前端·javascript
卷卷的小趴菜学编程6 分钟前
算法篇-------------双指针法
c语言·开发语言·c++·vscode·算法·leetcode·双指针法
Json_8 分钟前
Vue 内置组件 -slot讲解
前端·vue.js·深度学习
祯民18 分钟前
《生成式 AI 应用开发:基于 OpenAI API 开发》实体书上架
前端·aigc·openai
bigyoung23 分钟前
ts在运行时校验数据类型的探索
前端·javascript·typescript
独立开阀者_FwtCoder27 分钟前
深入解密Node共享内存:这个原生模块让你的多进程应用性能翻倍
前端·javascript·后端
飞鼠_28 分钟前
详解数据结构之树、二叉树、二叉搜索树详解 C++实现
开发语言·数据结构·c++
Json_29 分钟前
使用JS写一个用鼠标拖动DIV到任意地方
前端·javascript·深度学习
XWXnb632 分钟前
C语言:多线程
c语言·开发语言