Tree-V2 实现 全选、反选

使用场景:

需要一个 tree 树形结构体,但是采用 普通的 tree ,在数据量大的时候 会造成 tree 渲染的压力,尤其是在勾选的时候。

element ui plus 中 引入了 “Tree V2 虚拟化树形控件” 具体的内容可以 参考这里

<el-button @click="selectAll" size="small" type="primary">全选</el-button>
<el-button @click="deselectAll" size="small" type="primary">反选</el-button>

      <div style="margin-top: 15px">
        <el-input
            v-model="query"
            style="width: 240px;"
            placeholder="请输入关键字进行检索"
            @input="onQueryChanged"
            size="small"
        />
        <el-tree-v2
            ref="treeV"
            style="max-width: 800px"
            :data="data"
            :props="props"
            show-checkbox
            :filter-method="filterMethod"
            :height="400"
        >
          <template #default="{ node, data }">
            <!-- 自定义节点内容 -->

            <el-popover
                placement="right"
                :width="200"
                trigger="hover"
                :content="data.label"
                :effect="'dark'"
                :show-after="500"
            >
              <template #reference>
                <span>{{ data.label }}</span>
              </template>
            </el-popover>
          </template>
        </el-tree-v2>

其中

getCheckedNodes() 返回 获取所有勾选的 id

setCheckedKeys() 设置勾选的id

const setAllNodeChecked = (checked) => {
  console.log(treeV.value.getCheckedNodes(), 'treeV.value')
  console.log(treeV.value, 'treeV.value')
  if (treeV.value) {
    // 全选
    const nodes = treeV.value.getCheckedNodes()
    if (checked) {
      const checkTargetArray = nodes.filter(item => item.level === 1).length;
      if (checkTargetArray === data.value.length) {
        treeV.value.setCheckedKeys([])
      } else {
        // 选中的 key 的数组
        const allKeys = data.value.map(node => node.id);
        treeV.value.setCheckedKeys(allKeys);
      }
    } else {
      // 过滤出未选中的数组
      const unCheckedArray = differenceBy(data.value, nodes, 'id')
      // 选中的 key 的数组
      const allKeys = unCheckedArray.map(node => node.id);
      // 设置所有节点为选中状态
      treeV.value.setCheckedKeys(allKeys);
    }
  }
}

// arr1 - arr2 的差集
function differenceBy(arr1, arr2, prop) {
  const set = new Set(arr2.map(item => item[prop]));
  console.log(set, 'set')
  return arr1.filter(item => !set.has(item[prop]));
}

const setCheckedRecursive = (node, checked) => {
  node.checked = checked;
  console.log(node.checked, 'node.checked')
  if (node.children) {
    node.children.forEach(child => {
      setCheckedRecursive(child, checked);
    });
  }
}

// 全选
const selectAll = () => {
  setAllNodeChecked(true);
}
// 反选
const deselectAll = () => {
  setAllNodeChecked(false);
}
### 使用 `el-tree` 组件实现全选功能 在 Vue.js 中使用 Element UI 的 `el-tree` 组件可以方便地管理树形结构的数据。为了实现全选的功能,可以通过监听事件并操作数据来完成。 #### HTML 结构 定义一个按钮用于触发全选/的操作以及展示 `el-tree` 组件: ```html <template> <div> <button @click="selectAll">全选</button> <button @click="unSelectAll"></button> <el-tree :data="treeData" show-checkbox ref="tree"></el-tree> </div> </template> ``` #### JavaScript 部分 通过方法来处理全选逻辑: ```javascript <script> export default { data() { return { treeData: [ { label: '一级 1', children: [{ label: '二级 1-1', children: [{ label: '三级 1-1-1' }] }] }, { label: '一级 2', children: [{ label: '二级 2-1', children: [{ label: '三级 2-1-1' }] }, { label: '二级 2-2', children: [{ label: '三级 2-2-1' }] }] } ] }; }, methods: { selectAll() { this.$refs.tree.setCheckedNodes(this.getAllLeafNodes()); }, unSelectAll() { const allLeafNodes = this.getAllLeafNodes(); const selectedNodes = this.$refs.tree.getCheckedNodes(false, true); let nodesToUncheck = []; for (let node of allLeafNodes) { if (selectedNodes.includes(node)) { continue; } else { nodesToUncheck.push(node); } } this.$refs.tree.setCheckedNodes(nodesToUncheck); }, getAllLeafNodes() { function getLeaves(data) { let result = []; function traverse(item) { if (!item.children || !item.children.length) { result.push(item); } else { item.children.forEach(traverse); } } data.forEach(traverse); return result; } return getLeaves(this.treeData); } } }; </script> ``` 此代码片段展示了如何利用 `setCheckedNodes()` 和自定义函数 `getAllLeafNodes()` 来获取所有的叶子节点,并基于这些信息执行全选操作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值