el-tree 过滤后/搜索后 的 全选问题

本文介绍了在Vue项目中,利用el-tree组件结合filter-node-method属性进行数据筛选,并通过@check监听事件实现只选中筛选后子节点的操作。详细讲解了相关代码实现逻辑,包括获取叶子节点的id、处理选中状态等关键步骤。
摘要由CSDN通过智能技术生成

el-tree的数据在使用“filter-node-method”的方法之后,如何只选中筛选后的子节点

主要使用el-tree提供的@check来实现。 

<el-input
              v-model="filterText"
              style="margin-top: 10px"
              placeholder="请输入查询名称"
              clearable
            />
<el-tree
        
            ref="tree"
            show-checkbox
            highlight-current
            :data="list"
            :default-checked-keys="checkedList"
            node-key="id"
            :props="defaultProps"
            default-expand-all
            :expand-on-click-node="false"
            :filter-node-method="filterNode"
            @check="check"
/>
<script>
export default {
 data() {
    return {
      filterText: '',
      formInline: {},
      list: [],
      searchKey: '',
      disabled: false,
      ids: [],
      checkedList: [],
      defaultSelection: [],
      multipleSelection: [],
      defaultProps: {
        children: 'childGroups',
        label: 'name'
      }
    }
  },
watch: {
    filterText(val) {
      this.$refs.tree.filter(val)
    }, 
  },
methods: {
    check(data) {
      //data即当前点击的节点  
      if (data.childGroups.length) {
        // 获取当前选中的叶子节点的id
        const checkedIds = this.getLeafNodes(data.childGroups)
        checkedIds.forEach((item) => {
          const node = this.$refs.tree.getNode(item)//根据id获取node
          if (!node.visible && node.checked) {//将选中且隐藏的节点设置为 不选中
            this.$refs.tree.setChecked(item, false)
          }
        })
      }
    },
    //获取叶子节点的数据
    getLeafNodes(tree) {
      const arr = []
      tree.length &&
        tree.forEach((item) => {
          if (item.childGroups && item.childGroups.length) {
            arr.push(...this.getLeafNodes(item.childGroups))
          } else {
            arr.push(item.id)
          }
        })
      return arr
    },
    //父组件调用此方法,获取被选中的叶子节点
    getResult() {
      const result = this.$refs.tree.getCheckedNodes(true)
      return result
    },
    
  }
}
</script>

 

el-tree 的懒加载功能是通过动态加载子节点来实现的,因此在开启懒加载后,如果要实现全选功能,需要对 el-tree 的数据结构进行一些调整。 具体来说,你需要在每个节点的数据对象中添加一个 `isLoaded` 字段来标记该节点是否已经加载过子节点,同时在加载子节点时,需要将该字段设置为 `true`。 另外,在 el-tree全选功能实现中,会遍历所有节点来设置选中状态,但是在开启懒加载后,由于只有部分节点被加载,因此需要修改遍历逻辑,只遍历已经加载的节点,将它们的选中状态设置为与父节点相同。 下面是一个示例代码,可以参考一下: ```html <template> <el-tree :data="treeData" show-checkbox :check-strictly="true" :default-expand-all="true" @check-change="handleCheckChange" :load="lazyLoad" ></el-tree> </template> <script> export default { data() { return { treeData: [ { id: 1, label: 'Node 1', children: [], isLoaded: false }, { id: 2, label: 'Node 2', children: [], isLoaded: false }, { id: 3, label: 'Node 3', children: [], isLoaded: false } ] }; }, methods: { lazyLoad(node, resolve) { if (!node.isLoaded) { // 模拟异步加载子节点 setTimeout(() => { node.children = [ { id: node.id * 10 + 1, label: `Node ${node.id * 10 + 1}` }, { id: node.id * 10 + 2, label: `Node ${node.id * 10 + 2}` } ]; node.isLoaded = true; resolve(); }, 1000); } else { resolve(); } }, handleCheckChange(data) { const checkedNodes = this.$refs.tree.getCheckedNodes(true); const uncheckedNodes = this.$refs.tree.getCheckedNodes(false); const indeterminateNodes = this.$refs.tree.getHalfCheckedNodes(); const checkedKeys = checkedNodes.map(node => node.id); const uncheckedKeys = uncheckedNodes.map(node => node.id); const indeterminateKeys = indeterminateNodes.map(node => node.id); this.treeData.forEach(node => { if (node.isLoaded) { if (checkedKeys.includes(node.id)) { this.$refs.tree.setChecked(node, true); } else if (uncheckedKeys.includes(node.id)) { this.$refs.tree.setChecked(node, false); } else if (indeterminateKeys.includes(node.id)) { this.$refs.tree.setChecked(node, null); } } }); } } }; </script> ``` 在这个示例中,我们添加了一个 `isLoaded` 字段来标记节点是否已经加载过子节点,并在 `lazyLoad` 方法中设置这个字段。在 `handleCheckChange` 方法中,我们只遍历已经加载的节点,并将它们的选中状态设置为与父节点相同。 希望这个示例对你有帮助!
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值