关于《Ant-design-vue 树形控件tree 新增节点,删除节点,编辑节点的解决方案》文章的补充

2023-11-19

我看有不少人看到这个《Ant-design-vue 树形控件tree 新增节点,删除节点,编辑节点的解决方案》文章以后,有不少疑惑,关于删除,增加的问题,以及key重复的问题,我发的这篇文章只是提供了一个思路。

整合下,还是对你们详解一下,可能有些人看得不是很明白

关于dom

<a-button type="primary" @click="add">添加顶级菜单</a-button>
      <a-tree
        showLine
        @expand="onExpand"
        :expandedKeys="expandedKeys"
        :autoExpandParent="autoExpandParent"
        :treeData="treeData"
        style="margin-top:20px"
      >
        <template slot="custom" slot-scope="item">
          <span>{{ item.title }}</span>
          <a-button size="small" class="but_type" style="right:220px;" @click="()=> stop(item)">{{ item.menuStatus===0?'启用':'禁用' }}</a-button>
          <a-button size="small" class="but_type" style="right:160px;" @click="()=> append(item)">新增</a-button>
          <a-button
            class="but_type"
            size="small"
            style="right:100px;"
            @click="()=> handleEdit(item)"
          >编辑</a-button>
          <a-button class="but_type" size="small" @click="(e)=> remove(item)">删除</a-button>
        </template>
      </a-tree>

在DOM中,关于树的操作一共有4个事件,分别是

  • 添加顶级菜单事件add,
  • 启用和禁用菜单事件stop,
  • 新增菜单事件append,
  • 删除菜单事件remove
  • 编辑菜单事件handleEdit

关于逻辑

  • 首先我这边后台给的是一个一维数组,我需要把后台给的数组转换为树形结构,因此写了个方法
function treeDataTranslate (data, id = 'pid', pid = 'parentId') {
  var res = []
  var temp = {}
  for (var i = 0; i < data.length; i++) {
    data[i]['key'] = data[i].pid
    data[i]['title'] = data[i].menuName
    temp[data[i][id]] = data[i]
    data[i].scopedSlots = { title: 'custom' }
  }
  for (var k = 0; k < data.length; k++) {
    if (temp[data[k][pid]] && data[k][id] !== data[k][pid]) {
      if (!temp[data[k][pid]]['children']) {
        temp[data[k][pid]]['children'] = []
      }
      if (!temp[data[k][pid]]['_level']) {
        temp[data[k][pid]]['_level'] = 1
      }
      data[k]['_level'] = temp[data[k][pid]]._level + 1

      temp[data[k][pid]]['children'].push(data[k])
    } else {
      res.push(data[k])
    }
  }
  return res
}

通过这个方法转换出来的数据就是我想要的数据结构即DOM中的treeData数据

  • 其次当我需要修改和删除菜单的时候我需要在treeData中找到我需要删除和修改的项,因此也需要写一个工具函数
//该函数接收4个参数,option为我需要修改或者删除的数据项,arr为格式化后的treeData,type是需要操作的类型,默认为delect,obj为编辑后的数据,默认为空对象
searchOption (option, arr, type = 'delect', obj = {}) {
//首先循环arr最外层数据
      for (let s = 0; s < arr.length; s++) {
      //如果匹配到了arr最外层中的我需要修改的数据
        if (arr[s].key === option.key) {
        //判断需要操作的类型
          if (type === 'delect') {
          	//删除即删除即可
            arr.splice(s, 1)
          } else {
            //如果是修改,利用Object.assign()组合符合arr数据格式的对象,并进行修改
            this.$set(
              arr,
              s,
              Object.assign(obj, {
                key: obj.pid,
                title: obj.menuName,
                children: option.children,
                scopedSlots: { title: 'custom' }
              })
            )
          }
          break
        } else if (arr[s].children && arr[s].children.length > 0) {
          // 递归条件
          this.searchOption(option, arr[s].children, type, obj)
        } else {
          continue
        }
      }
    },
  • 关于增加菜单就不用说了,找到父级id,将增加的数据传给后台,成功后重新获取tree数据就行
  • 编辑菜单
handleEdit(data){
   //data为原数据,this.addParamData为修改后的数据
	//this.addParamData为传给后台接口的参数,具体依据项目而定
	saveSysMenu(this.addParamData)
          .then(result => {
            if (result) {
              this.scopeVisible = false
              this.noticeMessage('操作成功')
              //编辑成功以后后台会把编辑成功后的菜单数据返回回来,然后调用this.searchOption()方法即可
              this.scopeTitle === '编辑菜单'
                ? this.searchOption(this.addData, this.treeData, 'edit', result.result)
                : this.getMenuList()
            }
          })
          .catch(err => {
            console.log(err)
          })
}

  • 删除菜单
remove(data){
	deleteMenu({ pid: data.pid })
        .then(result => {
          if (result) {
            this.visible = false
            //删除成功后调用this.searchOption()的删除方法即可
            this.searchOption(this.addData, this.treeData)
          }
        })
        .catch(err => {
          console.log(err)
        })
        .finally(() => {
          this.confirmLoading = false
        })
}

此案例只是提供一种思路,主要是借鉴为主

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于《Ant-design-vue 树形控件tree 新增节点,删除节点,编辑节点的解决方案》文章的补充 的相关文章

  • 安全之公开密钥基本知识

    文件加密的基本知识 1 公开密钥密码 传统密码的缺点 1 收发双方持有相同密钥 密钥分配困难 KE KD K E K D 2 不能方便的实现数字签名 应用不方便 数字签名概念下面有 历史 公开密钥密码又称为双钥密码或非对称密码 是1976年

随机推荐

  • 企业网站建设方案书

    一 网站建设目标 1 1背景分析 现在网络的发展已呈现商业化 全民化 全球化的趋势 目前 几乎世界上所有的公司都在利用网络传递商业信息 进行商业活动 从宣传企业 发布广告 招聘雇员 传递商业文件乃至拓展市场 网上销售等 无所不能 如今网络已
  • iPhone Safari下iframe不显示滚动条无法滚动的解决方法

    div class dataTables wrapper style height 300px div
  • Go渗透测试笔记(二)---TCP,扫描器和代理

    Go渗透测试笔记 二 TCP 扫描器和代理 0x00 前言 TCP是面向连接协议的主要标准 也是现代网络的基础 作为攻击者 我们应当了解TCP的工作原理 并且能够开发可用的TCP结构体 以便可以识别 打开 关闭 的端口 找出错误的结果 如误
  • TCP/IP协议栈及网络基础,协议栈原理及实现

    1 TCP IP协议栈及网络基础 推荐这个在B站几千观看的视频讲解 底层原理到徒手实现 TCP IP网络协议栈 tcp协议栈 如何实现 C C Linux服务器开发高级架构学习视频点击 C C Linux服务器开发高级架构师 Linux后台
  • 正则表达式工具类

    在实际开发中总会使用到正则表达式匹配数据 我也是在后面查看了一些资料 下面写一个常用的正则表达式匹配集合 正则匹配模式 表示匹配字符串的开始位置 例外 用在中括号中 时 可以理解为取反 表示不匹配括号中字符串 表示匹配字符串的结束位置 表示
  • 量化交易动了谁的奶酪

    最近关于量化交易的政策讨论频出 在内容上 主要是限制其高频交易和某些可能对市场产生负面影响的行为 具体来说 中国证券监督管理委员会和上海证券交易所等机构都出台了相关政策 对量化交易的频率 规模 风险控制等方面进行了限制 这些政策的出台主要是
  • python--模块导入

    目录 模块简介 模块导入的两种方式 方式一 import 方式二 from import 模块简介 1 什么是模块 模块就是一系列功能的结合体 可以直接使用 2 为什么要用模块 极大地提升开发效率 拿来主义 gt gt gt 站在巨人的肩膀
  • docker部署redis集群实现动态扩缩容

    目录 思考 分布式存储的解决方案 哈希取余分区 一致性哈希算法分区 哈希槽分区 采用哈希槽分区 部署三主三从 docker 准备工作 创建3主3从redis实例 进入容器中 构建主从关系 主从容错切换迁移 主从扩容 主从缩容 思考 假如现有
  • canvas实战之酷炫背景动画(一)

    系列文章 canvas实战之酷炫背景动画 一 canvas实战之酷炫背景动画 二 canvas实战之酷炫背景动画 三 canvas实战之酷炫背景动画 四 canvas实战之酷炫背景动画 五 canvas实战之酷炫背景动画 六 canvas实
  • 09-java多线程

    多线程相关概念 并发和并行 并行 在同一时刻 有多个指令在多个CPU上同时执行 并发 在同一时刻 有多个指令在单个CPU上交替执行 进程和线程 进程 是正在运行的程序 独立性 进程是一个能独立运行的基本单位 同时也是系统分配资源和调度的独立
  • 分布式一致性协议Raft原理与实例

    thesecretlivesofdat 分布式一致性协议Raft原理与实例 标签 分布式算法 2015 09 30 20 43 3519人阅读 评论 15 收藏 举报 分类 Hadoop 7 版权声明 本文为博主原创文章 未经博主允许不得转
  • 客户端存储技术

    Cookie Cookie 是一种非常基础的客户端存储方式 得到广泛的支持 创建多个 cookie 的方法 document cookie name Jim document cookie age 18 当创建多个 cookie 时只能像这
  • chrome浏览器安装redux-devtools调试工具

    chrome浏览器安装redux devtools调试工具 1 点击进入https www chromefor com 2 在搜索框搜索redux 3 找到最新版本 Redux DevTools v2 17 0 进行下载 4 选择下载线路
  • Netty的零拷贝与ByteBuf

    Netty零拷贝 Netty的零拷贝完全是在用户态 Java 层面 的 它的零拷贝更多的是偏向于 优化数据操作 这样的概念 而不是操作系统层面的用户态和核心态之间的数据拷贝 Netty 的 零拷贝体现在如下几个个方面 Netty 提供了 C
  • java各种异常总结

    一 java异常汇总 1 Throwable 是所有异常的祖先 Throwable有两个子类 Error和Exception 2 Error是错误 表示运行应用程序中出现了严重错误 都是通过Error抛出的 一般程序无法处理 Excepti
  • STM32常用通信方式总结-IIC,SPI,USART/UART,232,485,CAN,USB,TypeC

    通信协议划分原理 1 通信协议划分 1 1串行和并行 串行通信就是设备之间通过少量的线 进行一位一位的数据传输 并行通信就是使用多根数据线同时进行数据传输 1 2 全双工 半双工 单工 全双工 在同一时刻 两个设备之间可以同时收发数据 半双
  • 获取li标签文本内容

    思路 为li对象添加单击事件 事件触发后利用innerHTML获取li的文本 实例演示如下 1 HTML结构
  • STM32串口收数据的几种不同方式

    引用 http www 51hei com bbs dpj 26383 1 html 本例程通过PC机的串口调试助手将数据发送至STM32 接收数据后将所接收的数据又发送至PC机 具体下面详谈 实例一 void USART1 IRQHand
  • JVM OOM和CPU问题排查

    目录 1 JVM调优工具 1 1 jps 1 2 jstat 1 3 jstack 1 4 jinfo 1 5 jmap 2 OOM排查过程 2 1 OOM原因 2 2 OOM发生区域 2 2 1 Java堆溢出 heap 2 2 2 Ja
  • 关于《Ant-design-vue 树形控件tree 新增节点,删除节点,编辑节点的解决方案》文章的补充

    我看有不少人看到这个 Ant design vue 树形控件tree 新增节点 删除节点 编辑节点的解决方案 文章以后 有不少疑惑 关于删除 增加的问题 以及key重复的问题 我发的这篇文章只是提供了一个思路 整合下 还是对你们详解一下 可