antd-vue树形表格父级选中后子级不可选的功能(动态改变disabled)

201 阅读2分钟

问题

20221212-103420.gif

1、选中后:

    (1)逻辑一:

        勾选时,取消当前材料的下层材料的勾选状态全部置灰

    (2)逻辑二:

        判断其他层级是否存在相同编码的材料:

        若存在,则判断该层级材料的勾选状态是否为**置灰**(父级/父级的父级/...../被勾选了):

        若为置灰,则不做处理;

        若不置灰,则勾选该材料,则执行逻辑一和逻辑二

    (3)逻辑三,将该材料对应的下层材料的勾选框设为【不可勾选】状态(置灰);

2、取消选中后

    (1)取消后,将该材料对应的下层材料的勾选框设为 【允许勾选】状态;

    (2)判断其他层级是否存在相同材料编码的材料:

        若存在,则判断该层级材料的勾选状态是否为**置灰**(父级/父级的父级/...../被勾选了):

        若不是,则取消勾选状态;

        若是,则不做处理;

接口返回的树形表格的数据都是一维数组,还是用我2年前发布的那个方法# 根据parentid(parent_id)拼树结构(js)组合,让儿孙曾孙都找到祖宗!

期间还解决了antd-vue树形表格defaultExpandAllRows全部展开无效的问题

方法:在每次获取表格数据时,设置一个随机key

image.png

image.png

以上可以解决每次树形表格数据变化时,都可以正常展开全部数据。

下面直接上勾选复选框和取消复选框的代码:

image.png image.png

主要是使用递归方法

findTableListItem (data, id) {
      data.forEach(e => {
        if(e.id == id) {
          this.findTableItem = e
          return
        }
        if (e?.children?.length) {
          this.findTableListItem(e.children, id)
        }
      })
},
selectFun (record) {
      const _this = this
      function getLevelStatus (record) {
        if (!record.parentId) {
          if (record?.children?.length) {
            return 1
          } else {
            return 4
          }
        } else {
          if (!record.children || !record.children.length) {
            return 3
          } else {
            return 2
          }
        }
      }
      function selectAllChildrens (data) {
        data.forEach(e => {
          if(_this.selectedRowKeys.includes(record.id)) {
            e.disabled = true;
            _this.selectedRowKeys.forEach((selectKey, index) => {
              if (e.id === selectKey) {
                _this.selectedRowKeys.splice(index, 1)
              }
            })
          } else {
            e.disabled = false;
          }
          if (e?.children?.length) {
            selectAllChildrens(e.children)
          }
        })
      }
      function findAllSameMaterialCode (record) {
        let tableList = deepClone(_this.tableList);
        tableList = flatten(tableList)
        // 物料编码 materialCode
 
        if(_this.selectedRowKeys.includes(record.id)) {
          tableList.forEach(e => {
            if(e.materialCode == record.materialCode && (!e.disabled && !e.alternativeType)) {
              _this.findTableListItem(_this.tableList, e.id); // 找到相同物料编码的当前级,设置下级不可勾选
              _this.findTableItem && _this.findTableItem.children && selectAllChildrens(_this.findTableItem.children); // 设置下级不可勾选
              !_this.selectedRowKeys.includes(e.id) && _this.selectedRowKeys.push(e.id);
            }
          })
        }else{
          let selectedRowKeysMaterialCode = _this.selectedRowKeys.map(item => {
            let filterMaterialCode = tableList.filter(f => f.id == item);
            return {
              materialCode: filterMaterialCode[0].materialCode,
              selectedRowKey: item
            }
          })
          _this.selectedRowKeys = selectedRowKeysMaterialCode.filter(item => item.materialCode !== record.materialCode).map(item => item.selectedRowKey);
          selectedRowKeysMaterialCode.forEach(item => {
            if(item.materialCode == record.materialCode){ // 找到相同物料编码,做下级可勾选的处理
              _this.findTableListItem(_this.tableList, item.selectedRowKey); // 找到相同物料编码的当前级,设置下级可勾选
              if(_this.findTableItem && _this.findTableItem.children) {
                !_this.findTableItem.disabled && selectAllChildrens(_this.findTableItem.children); // 如果查找的当前级是可勾选的,设置下级可勾选
              }
            }
          })
        }
      }

      const getLevel = getLevelStatus(record)
      if (getLevel === 1) {
        selectAllChildrens(record.children)
        findAllSameMaterialCode(record)
        this.updateTableList()
      } else if (getLevel === 2) {
        selectAllChildrens(record.children)
        findAllSameMaterialCode(record)
        this.updateTableList()
      } else {
        findAllSameMaterialCode(record)
        this.updateTableList()
      }
    }