element-ui之tree组件使用心得

element-ui tree 文档入口

1 上下拖拽

1.1 属性

1.2 事件

1.3 业务实现

需求:同等level 可以进行拖拽移动 不允许被拖至低于被拖拽元素level等级里

html 复制代码
<el-tree
  :data="treeList"
  :props="props"
  :allow-drop="allowDrop"
  node-key="id"
  draggable
  ref="tree"
  @node-drop="handleDrop"
></el-tree>
js 复制代码
data() {
    return {
        treeList: [],
        props: {
        label: "name",
        children: "children",
        isLeaf: "leaf",
      },
    }
},
methods: {
  /**
   * 需求:同等level 可以进行拖拽移动 不允许被拖至低于被拖拽元素level等级里
   *(即:一级与一级可以实现上下移动,二级节点可以被拖拽至其他一级下,但是一级不能拖至二级下成为子节点)
   * 拖拽时判定目标节点能否被放置
   * 参数依次是:被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置
   *
   * type 参数有三种情况:'prev'、'inner' 和 'next',分别表示放置在目标节点前、插入至目标节点和放置在目标节点后
   */
  allowDrop(draggingNode, dropNode, type) {
    if (draggingNode.level == dropNode.level) {
      // 如果level相同 允许追加到目标节点前后 不允许追加到目标节点里
      return type != "inner";
    } else if (draggingNode.level > dropNode.level) {
      // 子节点 level的值较大
      // 如果节点level从低拖到高(比如2级节点拖到1级) 仅允许追加目标节点里面(成为目标节点的子节点)
      return type == "inner";
    }
  }, 
  // 拖拽成功完成时触发的事件 参数:被拖拽节点对应的 Node、结束拖拽时最后进入的节点、被拖拽节点的放置位置(before、after、inner)、event
    handleDrop(draggingNode, dropNode, dropType, event) {
        const {
        level,
        data: { id },
      } = draggingNode;
      // 拖拽成功后更新接口数据
    }
}

2 新增与删除

2.1 追加在一级节点

js 复制代码
// 第二个参数key可以写0
this.$refs.tree.append(data, 0);

2.2 操作节点名称/追加至二级节点等

对于二级节点追加 或者节点名称修改,使用updateKeyChildren方法无法更新,只能通过重新更新整棵树的数据更新:

js 复制代码
// data 为接口返回的所有的数据
this.treeList = data

2.3 删除节点

js 复制代码
this.$refs.tree.remove(node);

2.4 插入节点

js 复制代码
this.$refs.tree.remove(node.data.id);
if (action == -1) {
// 上移
this.$refs.tree.insertBefore(tree[nodeIndex], tree[nodeIndex - 1]);
} else {
// 下移
this.$refs.tree.insertAfter(tree[nodeIndex], tree[nodeIndex + 1]);
}

2.5 获取某个节点

js 复制代码
// 此id是节点的唯一值
const node = this.$refs.tree.getNode(id);

3 勾选与反选

html 复制代码
<el-tree
  :props="props"
  :data="tree"
  :load="loadNode"
  :default-expanded-keys="expandedKeys"
  lazy
  ref="tree"
  node-key="id"
  show-checkbox
  check-strictly
  @check-change="handleCheckChange"
>
</el-tree>

3.1 默认首先与展开的数据

从接口获取的默认勾选的数据,需要通过遍历调用setChecked才能生效

js 复制代码
data() {
return {
      props: {
        label: "name",
        children: "children",
        isLeaf: "leaf",
      },
      tree: [],
      selectData: [], // 选择项目
      expandedKeys: [], // 展开的keys
    };
},
methods:{
    async loadNode(node, resolve) {
      // 通过接口获取默认展开的数据
        const data = await axios(...)
        // 默认需要展开的node
        this.expandedKeys = data.length ? [data[0].id] : [];
        //  this.selectData 就是默认需要勾选的数据 id是唯一值
        const checkedIds = this.selectData.filter((item) => item.id);
        // 处理初次加载时 默认勾选选中项
        checkedIds.forEach((item) => {
          this.$refs.tree.setChecked(item, true, false);
        });
        resolve([]);// 此次返回接口数据
    },  
}

3.2 勾选与反选

勾选与反选主要是操作check-change事件:

js 复制代码
// 选中
handleCheckChange(data, checked, indeterminate) {
  let index = this.selectData.findIndex((item) => item.id == data.id);
  if (index == -1 && checked) {
    // 取消筛选
    this.selectData.push(data);
    return;
  }
  if (index > -1 && !checked) {
    // 取消筛选
    this.selectData.splice(index, 1);
  }
},
相关推荐
海云前端17 分钟前
前端面试ai对话聊天通信怎么实现?面试实际经验
前端
一枚前端小能手9 分钟前
🔧 半夜被Bug叫醒的痛苦,错误监控帮你早发现
前端
Juchecar11 分钟前
Vue 3 单页应用Router路由跳转示例
前端
这人是玩数学的13 分钟前
在 Cursor 中规范化生成 UI 稿实践
前端·ai编程·cursor
UncleKyrie14 分钟前
🎨 市面上主流 Figma to Code MCP 对比
前端
南半球与北海道#27 分钟前
前端引入vue-super-flow流程图插件
前端·vue.js·流程图
然我34 分钟前
React 16.8:不止 Hooks 那么简单,这才是真正的划时代更新 🚀
前端·react.js·前端框架
小高0071 小时前
📈前端图片压缩实战:体积直降 80%,LCP 提升 2 倍
前端·javascript·面试
OEC小胖胖1 小时前
【React Hooks】封装的艺术:如何编写高质量的 React 自-定义 Hooks
前端·react.js·前端框架·web
BillKu1 小时前
vue3+element-plus 输入框el-input设置背景颜色和字体颜色,样式效果等同于不可编辑的效果
前端·javascript·vue.js