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);
  }
},
相关推荐
杨超越luckly5 分钟前
HTML应用指南:利用GET请求获取网易云热歌榜
前端·python·html·数据可视化·网易云热榜
前端_yu小白6 分钟前
React实现Vue的watch和computed
前端·vue.js·react.js·watch·computed·hooks
多看书少吃饭8 分钟前
OnlyOffice 编辑器的实现及使用
前端·vue.js·编辑器
编程之路从0到116 分钟前
JSI入门指南
前端·c++·react native
开始学java17 分钟前
别再写“一锅端”的 useEffect!聊聊 React 副作用的逻辑分离
前端
百度地图汽车版22 分钟前
【智图译站】基于异步时空图卷积网络的不规则交通预测
前端·后端
qq_124987075325 分钟前
基于Spring Boot的“味蕾探索”线上零食购物平台的设计与实现(源码+论文+部署+安装)
java·前端·数据库·spring boot·后端·小程序
用户658681803384026 分钟前
Vue3 项目编码规范:基于Composable的清晰架构实践
vue.js
编程之路从0到127 分钟前
React Native 之Android端 Bolts库
android·前端·react native
小酒星小杜27 分钟前
在AI时代,技术人应该每天都要花两小时来构建一个自身的构建系统 - Build 篇
前端·vue.js·架构