vue+antDesign实现树形数据展示及勾选联动

 更新时间:2023年02月05日 09:51:17   作者:Sunny_lxm  
本文主要介绍了vue+antDesign实现树形数据展示及勾选联动,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

vue使用antdesign实现树形结构表格展示,选中和取消事件不能实现父子级的联动。 

 解决:selectedRowKeys: selectedRowKeys,onChange: onSelectChange, onSelect: onSelectRow, onSelectAll: onSelectAll

实现数据交互时定义方法

<a-table
        :rowKey='record => record.accountList && record.accountList.length ? record.id : record.id'
        :columns="columns"
        :data-source="marketingList"
        :row-selection="{selectedRowKeys: selectedRowKeys,onChange: onSelectChange, onSelect: onSelectRow, onSelectAll: onSelectAll}"
        childrenColumnName = "accountList">
</a-table>
 

注意:树形结构数据中,要有能区分级别的字段以便于区分父级还是子级,知道父子级的所属关系 

selectedRowKeys: [], // 选中的行的key值
      selectedRows: [], // 选中行的row
 
methods:{
     // 表格checkbox选中事件
    onSelectChange (selectedRowKeys, selectedRows) {
      console.log('selectedRowKeys changed: ', selectedRowKeys, selectedRows)
      this.selectedRowKeys = selectedRowKeys
      this.selectedRows = selectedRows
    },
    // 表格checkAll 操作
    onSelectAll (selected, selectedRows, changeRows) {
      let newArr = []
      console.info(selected, 'onSelectAll')
      // 将自定义字段 修改为对应状态
      if (selected) {
        // 递归添加自定义字段 checkBox: true (选中), false(未选中)
        this.traverseTree(this.marketingList, newArr, true)
      } else {
        this.traverseTree(this.marketingList, newArr, false)
      }
      this.marketingList = newArr
    },
    // 表格单行数据被选中事件
    onSelectRow: function (record, selected, selectedRows) {
      console.info(record, selected, selectedRows, 'selected')
      record.checkFlag = !record.checkFlag // 更改选中row的选中状态
      // antD此版本 注:暂不支持父子数据递归关联选择。选中第一级时需要手动添一级下的所有第二级
      // 选中父级&&父级有子元素
      if (record.type === 1 && record.accountList.length > 0) {
        // 修改子级的自定义checkFlag值
        record.accountList.forEach(item => {
          item.checkFlag = record.checkFlag
        })
        // 判断是选中还是取消选中
        if (record.checkFlag) { // 选中
          // 手动添加选中店第二级
          this.selectedRowKeys.push(record.id) // 一级id存入到选中的key集合中
          this.selectedRows.push(record) // 一级id存入到选中的row集合中
          // 遍历选中的一级的子级 子级全部存入到选中的key集合中、row集合中
          record.accountList.map(account => {
            this.selectedRowKeys.push(account.id)
            // 去重- 关键
            this.selectedRowKeys = this.selectedRowKeys.filter((x, index, self) => self.indexOf(x) === index)
          })
          this.selectedRows = this.selectedRows.concat(record.accountList)
          // 去重- 关键
          this.selectedRows = this.selectedRows.filter((x, index, self) => self.indexOf(x) === index)
        } else { // 取消选中
          // 取消本身
          this.selectedRowKeys = this.selectedRowKeys.filter(item => item !== record.id)
          this.selectedRows = this.selectedRows.filter(item => item.id !== record.id)
 
          // 手动取消一级下所有二级的选中状态
          record.accountList.forEach(account => {
            this.selectedRowKeys.forEach((selectKey, index) => {
              if (account.id === selectKey) {
                this.selectedRowKeys.splice(index, 1)
              }
            })
            this.selectedRows.forEach((selectRow, index) => {
              if (account.id === selectRow.id) {
                this.selectedRows.splice(index, 1)
              }
            })
          })
        }
      } else { // 操作子级checkbox
        // 找到子级所属父级
        let parent = ''
        this.marketingList.forEach(item => {
          if (item.id === record.childID) {
            parent = item
          }
        })
        if (record.checkFlag) { // 选中
          // 选中子级 如果子级全部被选中,对应父级被选中
          let checkArr = []
          checkArr = parent.accountList.filter(account => account.checkFlag)
          if (checkArr.length === parent.accountList.length) { // 子级全部被选中
            // 父级变更为被选中
            this.marketingList.forEach(item => {
              if (item.id === record.childID) {
                item.checkFlag = true
              }
            })
            this.selectedRowKeys.push(parent.id)
            this.selectedRows.push(parent)
          }
        } else {
          // 取消任意子级选中状态 父级取消被选中
          this.selectedRowKeys.forEach((selectKey, index) => {
            if (parent.id === selectKey) {
              this.selectedRowKeys.splice(index, 1)
            }
          })
          this.selectedRows.forEach((selectRow, index) => {
            if (parent.id === selectRow.id) {
              this.selectedRows.splice(index, 1)
            }
          })
         // 父级变更为取消选中
          this.marketingList.forEach(item => {
            if (item.id === record.childID) {
              item.checkFlag = false
            }
          })
        }
      }
    },
}

效果图:

到此这篇关于vue+antDesign实现树形数据展示及勾选联动的文章就介绍到这了,更多相关vue 树形数据展示及勾选联动内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Vue使用lodop实现打印小结

    Vue使用lodop实现打印小结

    这篇文章主要介绍了Vue使用lodop打印小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Vue自定义Form组件实现方法介绍

    Vue自定义Form组件实现方法介绍

    这篇文章主要介绍了Vue自定义Form组件的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-10-10
  • vue elementui异步给dom赋值无效问题

    vue elementui异步给dom赋值无效问题

    这篇文章主要介绍了vue elementui异步给dom赋值无效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • el-input设置后缀显示单位并阻止滚轮微调的解决方法

    el-input设置后缀显示单位并阻止滚轮微调的解决方法

    在Element UI或Element Plus中,使用el-input组件时,可以通过suffix插槽添加单位显示,如果设置了type为'number',滚轮滚动可能会导致数值微调,解决方法是阻止滚轮事件的默认行为,并用CSS隐藏掉输入框的上下箭头,确保数值输入的准确性,这样既美观又提升了用户体验
    2024-09-09
  • axios请求二次封装之避免重复发送请求

    axios请求二次封装之避免重复发送请求

    在做vue中大型项目的时候,官方推荐使用axios,但是原生的axios可能对项目的适配不友好,所以在工程开始的来封装一下axios,下面这篇文章主要给大家介绍了关于axios请求二次封装之避免重复发送请求的相关资料,需要的朋友可以参考下
    2022-10-10
  • element根据输入动态生成表格的示例代码

    element根据输入动态生成表格的示例代码

    在现代电商系统开发中,后台管理界面经常需要根据商品规格和规格值动态生成SKU表格,本文通过element-ui框架,展示了如何在Vue.js的环境下,利用子组件和动态绑定的方式,实现SKU表格的增删改查功能
    2024-11-11
  • Vue3+Canvas实现简易的贪吃蛇游戏

    Vue3+Canvas实现简易的贪吃蛇游戏

    贪吃蛇作为一个经典的小游戏,是很多人儿时的记忆,当时的掌机、诺基亚手机里面都有它的身影。本文将用Vue3 Canvas来复刻一下这款游戏,感兴趣的可以了解一下
    2022-07-07
  • 基于elementUI使用v-model实现经纬度输入的vue组件

    基于elementUI使用v-model实现经纬度输入的vue组件

    这篇文章主要介绍了基于elementUI使用v-model实现经纬度输入的vue组件,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • Vue网页html转换PDF(最低兼容ie10)的思路详解

    Vue网页html转换PDF(最低兼容ie10)的思路详解

    这篇文章主要介绍了Vue网页html转换PDF(最低兼容ie10)的思路详解,实现此功能需要引入两个插件,需要的朋友可以参考下
    2017-08-08
  • Element修改弹窗类组件的层级的实现

    Element修改弹窗类组件的层级的实现

    本文主要介绍了Element修改弹窗类组件的层级的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论