文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-02-05 15:01

关注

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 树形数据展示及勾选联动内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

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

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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯