我的编程空间,编程开发者的网络收藏夹
学习永远不晚

基于ElementUI中Table嵌套实现多选的示例代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于ElementUI中Table嵌套实现多选的示例代码

前言:

写这个是因为帮朋友修改项目中的bug
我也是第一次写这个功能,有不对的希望大家指正,如果看完有帮助点个赞!
代码中关键是js中Tree的路径查找这个核心,有不懂的自行百度
多了不说了,有需要的可以私信找我要代码,来看下我怎么实现的

思路:

从头开始看这个需求,我们需要知道用到哪写东西

1、表格Table
2、多选&全选
3、嵌套数据(下拉操作)

正好我们可以找下ElementUI官方文档

找到了我们需要用到的API

  • 在嵌套数据的时候需要使用tree-props
  • 选中数据的时候使用toggleRowSelection

基本就以上这些能用到的可以开搞了

实现:

基于以上我们可以写出HTML结构


<template>
 <div>
  <el-table
   ref="multipleTable"
   :data="tableData"
   style="width: 100%; margin-bottom: 20px"
   row-key="id"
   border
   default-expand-all
   :select-on-indeterminate="true"
   :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
   @select="rowSelect"
   @select-all="selectAll"
  >
   <el-table-column type="selection" width="55"> </el-table-column>
   <el-table-column prop="date" label="日期" width="180"> </el-table-column>
   <el-table-column prop="name" label="姓名" width="180"> </el-table-column>
   <el-table-column prop="address" label="地址"></el-table-column>
  </el-table>
 </div>
</template>

表格的多选我可以分为2项目,1个是正向选中,意思就是checkout为true的时候,2是反向取消就是checkout为false的时候,那下面我就来分析下这个正向选中和反向取消如何实现

一、正向选中

假设我有这样的数据
以下面图1片为例:
    在点击子节点的时候我们需要把子节点的父节点和跟节点同时进行选中处理
    跟节点-父节点-子节点
    图2是我data中声明的数据,数据中包含isChecked是否被选中和children是否有子节点

现在我们正向选中思路明确了那我们怎么来实现?

当我点击子节点时候需要记录子节点的父节点一直到跟节点,那我们就用到了Tree树的概念

下面代码用到了树的回溯的思想,查找路径使用先序遍历,因为你不确定你点击的是子节点是在哪个子树上,
具体的Tree方法思想请百度一下;


treeFindPath(tree, func, path = []) {
   if (!tree) return [];
   for (const data of tree) {
    path.push(data);
    if (func(data)) return path;
    if (data.children) {
     const findChildren = this.treeFindPath(data.children, func, path);
     if (findChildren.length) return findChildren;
    }
    path.pop();
   }
   return [];
  },

通过上面这段代码我们调用的时候传节点的id会返回一个数组,数组包含它所在路径上的对象,这样我们就可以通过循环遍历这个数组通过toggleRowSelection反法来实现页面状态样式的改变。

二、反向取消

反向取消正好和选中相反
在点击子节点取消的时候我们需要判断同级的节点是不是都取消了,如果都取消了需要把这个节点的父节点改为取消状态,之后再查其父节点同级是否都是取消状态,如果还有取消状态,同理跟刚才方式一样接着向其上级节点查找直到不满足条件为止,跳出循环。

简单的来个示意图

在点击4节点时,会查看同级节点5和6是否是取消状态,如果都是取消状态,查他们的上一级2,把2改为false,在查2的同级3是否是取消如果是取消在查1
如果同级有选中状态会直接跳出循环不进行下一步操作

下面是取消选中代码

还是用Tree的代码,把获取的数组reverse()进行了翻转
第一次循环从点击那个节点网上查找
这里使用for循环如果不满足直接终止后面循环

三、全选

这里我感觉写的比较啰嗦,
全选时候我会先通过数据中isChecked来递归判断是否有没有选中的
如果有没有选中会递归执行把所有数据中的isChecked变为true,如果都选中了,会递归修改为false,

下面是全选的所有代码


  
  selectAll(selection) {
   console.log(selection);
   let isAllCheck = this.selectAllRecursion(this.tableData);
   // 是否有aa为false代表是有没选中
   this.checkoutAll(this.tableData, !isAllCheck);
  },
  
  selectAllRecursion(arr) {
   let isCheck = true;
   function isRecursion(arr) {
    arr.forEach((item) => {
     if (!item.isChecked) {
      isCheck = false;
      if (item.children) {
       isRecursion(item.children);
      }
     }
    });
   }
   isRecursion(arr);
   return isCheck;
  },
  
  checkoutAll(arr, boole) {
   var _this = this;
   function allCheck(arr, boole) {
    arr.forEach((item) => {
     item.isChecked = boole;
     _this.$refs.multipleTable.toggleRowSelection(item, boole);
     if (item.children) {
      allCheck(item.children, boole);
     }
    });
   }
   allCheck(arr, boole);
  },

END:

基本代码就以上这些,不包含表格分页功能

到此这篇关于基于ElementUI中Table嵌套实现多选的示例代码的文章就介绍到这了,更多相关ElementUI Table嵌套多选内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

基于ElementUI中Table嵌套实现多选的示例代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

基于WPF实现多选下拉控件的示例代码

这篇文章主要为大家详细介绍了WPF实现简单的多选下拉控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
2023-02-01

基于Python实现牛牛套圈小游戏的示例代码

“幸运牛牛套圈圈”套住欢乐,圈住幸福,等你来挑战!这篇文章小编主要为大家介绍一款基于Python实现牛牛套圈小游戏,感兴趣的小伙伴可以了解一下
2023-02-13

基于Python实现录音功能的示例代码

今天我们来介绍一个好玩且实用的东西,我们使用python来实现一个录音的功能。文中的示例代码简洁易懂,感兴趣的小伙伴快跟随小编一起学习一下吧
2023-02-07

基于Vue3实现日历组件的示例代码

日历在很多地方都可以使用的到,这篇文章主要介绍了如何利用vue3实现简单的日历控件,文中通过示例代码讲解详细,需要的朋友们下面随着小编来一起学习学习吧
2023-05-17

基于WPF实现步骤控件的示例代码

这篇文章主要为大家详细介绍了WPF实现简单的步骤控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
2023-01-11

基于WPF实现蒙板控件的示例代码

这篇文章主要为大家详细介绍了WPF实现蒙板控件,文中的示例代码讲解详细,对我们学习或工作有一定帮助,感兴趣的小伙伴可以了解一下
2023-03-09

基于Python实现24点游戏的示例代码

这篇文章主要为大家详细介绍了如何利用Python实现24点游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-12-08

编程热搜

目录