IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> React 后台管理系统之权限列表——antd引入、树形表格、删除、配置 -> 正文阅读

[JavaScript知识库]React 后台管理系统之权限列表——antd引入、树形表格、删除、配置

RightList.js

import React, { useState, useEffect } from 'react'
import axios from 'axios'
import { Table, Tag, Button, Modal, Popover, Switch } from 'antd'
import { DeleteOutlined, EditOutlined } from "@ant-design/icons"
import { ExclamationCircleOutlined } from '@ant-design/icons';
const { confirm } = Modal;

export default function RightList() {
  const [dataSource, setdataSource] = useState([])
  //拿到table中的内容
  useEffect(() => {
    //表格支持树形数据的展示,当数据中有 children 字段时会自动展示为树形表格
    //如果不需要或配置为其他字段可以用 childrenColumnName 进行配置
    axios.get('http://localhost:3000/rights?_embed=children').then(
      res => {
        //使得home的children:[]改为“”,就不会有“可展开”的图标
        const list = res.data
        list.forEach(
          item => {
            if (item.children.length === 0) {
              item.children = ""
            }
          }
        )
        setdataSource(list)
      }
    )
  }, [])
  //来自antd dataIndex要和后端键名一致
  const columns = [
    {
      title: 'ID',
      dataIndex: 'id',
      render: (id) => {
        return <b>{id}</b>
      }
    },
    {
      title: '权限名称',
      dataIndex: 'title',
      key: 'title',
    },
    {
      title: '权限路径',
      dataIndex: 'key',
      render: (key) => {
        return <Tag color="lime">{key}</Tag>
      }
    },
    {
      title: '操作',
      //item就是此对象
      render: (item) => {
        return <div>
          <Button danger shape="circle" icon={<DeleteOutlined />} style={{ marginRight: "5px" }}
            onClick={() => confirmMethod(item)} />
          {/* trigger控制可点击触发popover disabled控制是否为灰色禁用 */}
          <Popover content=
            {<div style={{ textAlign: "center" }}>
              <Switch
                checked={item.pagepermisson}
                onClick={() => switchMethod(item)}></Switch>
            </div>}
            title="Title"
            trigger={item.pagepermisson === undefined ? '' : 'click'}>
            <Button type="primary" shape="circle" icon={<EditOutlined />}
              disabled={item.pagepermisson === undefined && true} />
          </Popover>
        </div>
      }
    }
  ];
  
  //切换权限方法
  const switchMethod = (item) => {
    //关闭变打开 打开变关闭
    item.pagepermisson = item.pagepermisson === 1 ? 0 : 1
    //渲染页面 
    setdataSource([...dataSource])
    //后端更新 补丁方法
    if (item.grade === 1) {//外层一级
      axios.patch(`http://localhost:3000/rights/${item.id}`, {
        pagepermisson: item.pagepermisson
      })
    } else {//内层二级
      axios.patch(`http://localhost:3000/children/${item.id}`, {
        pagepermisson: item.pagepermisson
      })
    }
  }

  //删除权限方法
  const confirmMethod = (item) => {
    confirm({
      title: '你确定要删除?',
      icon: <ExclamationCircleOutlined />,
      onOk() {
        deleteMethod(item)
      },
      onCancel() {
        console.log('Cancel');
      },
    });
  }

  //确定删除方法
  const deleteMethod = (item) => {
    console.log(item);
    //一级——树形层级为最外层时候
    if (item.grade === 1) {
      //当前页面同步状态  //.filter方法直接返回一个新的数组
      setdataSource(dataSource.filter(
        data => data.id !== item.id//循环每一项的id,如果不等于点击的id,才过滤出来
      ))
      //后端同步
      axios.delete(`http://localhost:3000/rights/${item.id}`)
    } else {
      //二级——树形层级为内层时候
      console.log(item.rightId);//打印出2 为第二项内层数据
      let list = dataSource.filter(
        data => data.id === item.rightId //找到点击的最外层的id 返回的list是[{}]里面只有最外层这一项
      )
      //把找到的这最外层一级的children重新赋值
      list[0].children = list[0].children.filter(
        childData => childData.id !== item.id //除了点击的内层的id那项 都返回到新数组
      )
      setdataSource([...dataSource])//等于dataSource的新数组
      //后端同步
      axios.delete(`http://localhost:3000/children/${item.id}`)
    }
  }

  return (
    //antd的table自带分页pagination
    <div>
      <Table dataSource={dataSource} columns={columns}
        pagination={{
          pageSize: 5
        }} />
    </div>
  )
}

//http://localhost:3000/rights?_embed=children
// [
//   {
//     "id": 1,
//     "title": "首页",
//     "key": "/home",
//     "pagepermisson": 1,
//     "grade": 1,
//     "children": []
//   },
//   {
//     "id": 2,
//     "title": "用户管理",
//     "key": "/user-manage",
//     "pagepermisson": 1,
//     "grade": 1,
//     "children": [
//       {
//         "id": 3,
//         "title": "添加用户",
//         "rightId": 2,
//         "key": "/user-manage/add",
//         "grade": 2
//       },
//       {
//         "id": 4,
//         "title": "删除用户",
//         "rightId": 2,
//         "key": "/user-manage/delete",
//         "grade": 2
//       },
//       {
//         "id": 5,
//         "title": "修改用户",
//         "rightId": 2,
//         "key": "/user-manage/update",
//         "grade": 2
//       },
//       {
//         "id": 6,
//         "title": "用户列表",
//         "rightId": 2,
//         "key": "/user-manage/list",
//         "pagepermisson": 1,
//         "grade": 2
//       }
//     ]
//   },
//   {
//     "id": 7,
//     "title": "权限管理",
//     "key": "/right-manage",
//     "pagepermisson": 1,
//     "grade": 1,
//     "children": [
//       {
//         "id": 8,
//         "title": "角色列表",
//         "rightId": 7,
//         "key": "/right-manage/role/list",
//         "pagepermisson": 1,
//         "grade": 2
//       },
//       {
//         "id": 9,
//         "title": "权限列表",
//         "rightId": 7,
//         "key": "/right-manage/right/list",
//         "pagepermisson": 1,
//         "grade": 2
//       },
//       {
//         "id": 10,
//         "title": "修改角色",
//         "rightId": 7,
//         "key": "/right-manage/role/update",
//         "grade": 2
//       },
//       {
//         "id": 11,
//         "title": "删除角色",
//         "rightId": 7,
//         "key": "/right-manage/role/delete",
//         "grade": 2
//       },
//       {
//         "id": 12,
//         "title": "修改权限",
//         "rightId": 7,
//         "key": "/right-manage/right/update",
//         "grade": 2
//       },
//       {
//         "id": 13,
//         "title": "删除权限",
//         "rightId": 7,
//         "key": "/right-manage/right/delete",
//         "grade": 2
//       }
//     ]
//   },
//   {
//     "id": 14,
//     "title": "新闻管理",
//     "key": "/news-manage",
//     "pagepermisson": 1,
//     "grade": 1,
//     "children": [
//       {
//         "id": 15,
//         "title": "新闻列表",
//         "rightId": 14,
//         "key": "/news-manage/list",
//         "grade": 2
//       },
//       {
//         "id": 16,
//         "title": "撰写新闻",
//         "rightId": 14,
//         "key": "/news-manage/add",
//         "grade": 2,
//         "pagepermisson": 1
//       },
//       {
//         "id": 17,
//         "title": "新闻更新",
//         "rightId": 14,
//         "key": "/news-manage/update/:id",
//         "grade": 2,
//         "routepermisson": 1
//       },
//       {
//         "id": 18,
//         "title": "新闻预览",
//         "rightId": 14,
//         "key": "/news-manage/preview/:id",
//         "grade": 2,
//         "routepermisson": 1
//       },
//       {
//         "id": 19,
//         "title": "草稿箱",
//         "rightId": 14,
//         "key": "/news-manage/draft",
//         "pagepermisson": 1,
//         "grade": 2
//       },
//       {
//         "id": 20,
//         "title": "新闻分类",
//         "rightId": 14,
//         "key": "/news-manage/category",
//         "pagepermisson": 1,
//         "grade": 2
//       }
//     ]
//   },
//   {
//     "id": 21,
//     "title": "审核管理",
//     "key": "/audit-manage",
//     "pagepermisson": 1,
//     "grade": 1,
//     "children": [
//       {
//         "id": 22,
//         "title": "审核新闻",
//         "rightId": 21,
//         "key": "/audit-manage/audit",
//         "pagepermisson": 1,
//         "grade": 2
//       },
//       {
//         "id": 23,
//         "title": "审核列表",
//         "rightId": 21,
//         "key": "/audit-manage/list",
//         "pagepermisson": 1,
//         "grade": 2
//       }
//     ]
//   },
//   {
//     "id": 24,
//     "title": "发布管理",
//     "key": "/publish-manage",
//     "pagepermisson": 1,
//     "grade": 1,
//     "children": [
//       {
//         "id": 25,
//         "title": "待发布",
//         "rightId": 24,
//         "key": "/publish-manage/unpublished",
//         "pagepermisson": 1,
//         "grade": 2
//       },
//       {
//         "id": 26,
//         "title": "已发布",
//         "rightId": 24,
//         "key": "/publish-manage/published",
//         "pagepermisson": 1,
//         "grade": 2
//       },
//       {
//         "id": 27,
//         "title": "已下线",
//         "rightId": 24,
//         "key": "/publish-manage/sunset",
//         "pagepermisson": 1,
//         "grade": 2
//       }
//     ]
//   }
// ]

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-05 11:57:28  更:2021-12-05 11:59:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:39:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码