9.el-tree懒加载+全局搜索+叶子节点复选框

1,441 阅读1分钟

需求:el-tree懒加载数据,并且支持全局搜索,叶子节点复选框勾选状态不丢失。

  • 问题1:懒加载的数据,不展开一次节点,搜索时无法搜索到。

  • 解决:控制懒加载状态,搜索时关闭懒加载,使用:data=data去默认显示数据。没有搜索时,data清空,开启懒加载并重新执行获取父节点数据方法。

  • 问题2:动态控制懒加载状态,叶子节点的复选框会丢失

  • 解决:使用this.$refs.tree.getCheckedNodes()this.$refs.tree.setCheckedKeys(idList)控制节点的选中状态。

  1. 组件

:data="data"取消懒加载时的数据存放

check-strictly父级点与叶子节点互不关联

check-change复选框改变状态时的事件

node-click节点点击时的事件

:filter-node-method

// 布局
<van-search placeholder="输入关键字进行过滤" v-model="filterText" />
<el-tree
            class="filter-tree"
            :data="data"
            :props="defaultProps"
            :load="loadNode"
            lazy
            check-strictly
            show-checkbox
            @check-change="handleCheckChange"
            @node-click="nodeClick"
            :filter-node-method="filterNode"
            node-key="id"
            ref="tree"/>
  1. 监听输入值 this.$refs.tree.$data.store.lazy = false;
watch: {
    filterText(val) {
      this.lazyArr = [...this.$refs.tree.getCheckedNodes()];
      let idList = [];
      this.$refs.tree.filter(val);
// -----------------------1.输入状态时,取消懒加载,重新发起请求获取数据并赋值给data
      if (val.trim() !== "") {
        this.$refs.tree.$data.store.lazy = false;
        this.data = [];
        getLikeMember({ name: val }).then((res) => {数据处理}
          this.$nextTick(() => {
            // 1. 展开所有节点
            const nodes = this.$refs.tree.store._getAllNodes();
            for (let i in nodes) {
              nodes[i].expanded = true;
            }
            // 2. 选中前页已选中的状态
           
            this.lazyArr.map((item) => {
              idList.push(item.id);
            });
            // 
            this.$refs.tree.setCheckedKeys(idList);
            this.checkedArr = [...this.$refs.tree.getCheckedNodes()];
          });
        });
      } else {
// -----------------------2.清空输入值状态,实行懒加载,重新获取一级组织架构
        console.log(this.$refs.tree.getCheckedNodes());
        this.searchArr = this.$refs.tree.getCheckedNodes();
        this.$refs.tree.$data.store.lazy = true;
        this.getMember();
      }
    }
  },

  1. 懒加载
    loadNode(node, resolve) {
// ---------------- 1. 未展开时的父节点数据
      if (node.level === 0) {
        return resolve(this.data);
      }
// ---------------- 2. 展开的叶子节点数据
      if (node.level >= 1) {
        getTreeList({
          page: 1,
          count: 10000,
          name: "",
          deptId: node.data.id
        }).then((res) => {
          let data = [];
          res.data.data.records.map((item) => {
            if (item.id != this.userId) {
              data.push({
                id: item.id,
                label: item.name,
                leaf: true
              });
            }
          });
          resolve(data);

          let idList = [];
          // 设置已有叶子节点勾选状态-------
       this.$refs.tree.getCheckedNodes().map((item) => {
            idList.push(item.id);
          });
            this.$refs.tree.setCheckedKeys(idList)       
        });
      }
    },