项目实战-角色列表

抄上一次写过的代码:

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
相关推荐
用户600071819104 分钟前
【翻译】React 如何乱序流式输出 UI,却仍保持最终顺序
前端
阿里嘎多学长12 分钟前
2026-05-03 GitHub 热点项目精选
开发语言·程序员·github·代码托管
江南十四行14 分钟前
AI Agent应用类型及Function Calling开发实战(三)
服务器·前端·javascript
yqcoder16 分钟前
JavaScript 数据类型全景图:从基础到进阶
开发语言·javascript·ecmascript
GISer_Jing17 分钟前
AI原生全栈架构理论体系:从分布式范式演进到全链路工程化理论基石
前端·人工智能·学习·ai编程
GISer_Jing19 分钟前
从“切图仔”到“增长架构师”:AI时代营销前端的范式革命
前端·人工智能·ai编程
rKWP8gKv724 分钟前
单例模式在Java中的7种实现:从懒汉式到静态内部类
java·开发语言·单例模式
广州华水科技29 分钟前
单北斗GNSS在水库变形监测中的应用与系统安装解析
前端
xingpanvip42 分钟前
星盘接口开发文档:组合三限盘接口指南
android·开发语言·前端·python·php·lua
阿拉丁的梦1 小时前
blender最好的多通道吸色工具(拾取纹理颜色排除灯光)
前端·html