当前位置:   article > 正文

el-tree树形控件

el-tree

 官网:Element - The world's most popular Vue UI framework

 应用场景:

        1、自定义树节点内容,鼠标悬浮树节点,右侧出现节点增删改操作;

        2、树形控件增加纵向滚动条;    

        3、关键字过滤树节点数据;

        4、节点文本数据自适应宽度且溢出省略;

        5、默认展开第一个节点;

 代码如下:

  1. <el-scrollbar class="treeWrap">
  2. <div class="treeSearch">
  3. <el-input placeholder='请输入关键词' v-model="keywords"></el-input>
  4. </div>
  5. <el-tree
  6. class="el-tree"
  7. ref="treeRef"
  8. :data="treeData"
  9. node-key="id"
  10. :props="defaultProps"
  11. :highlight-current="true"
  12. :expand-on-click-node="false"
  13. :default-expanded-keys="defaultExpandedIdArr",
  14. :filter-node-method="filterNode"
  15. @node-click="nodeClick"
  16. >
  17. <div
  18. class="custom-tree-node"
  19. slot-scope="{ node, data }",
  20. @mouseenter="labelHover($event, node, data)"
  21. @mouseleave="labelHoverLeave($event, node, data)"
  22. >
  23. <el-tooltip
  24. effect="dark",
  25. :content="node.label",
  26. placement="top-start",
  27. :open-delay="1000"
  28. >
  29. <span class="labelName">{{ node.label}}</span>
  30. </el-tooltip>
  31. <span class="showIcon" v-show="node.showIcon">
  32. <i class="iconfont icon-xinjianwenjianjia"
  33. @click.stop="iconClick(data, node, 1)">
  34. </i>
  35. <i class="iconfont icon-bianji"
  36. @click.stop="iconClick(data, node, 2)">
  37. </i>
  38. <i class="iconfont icon-lajitong"
  39. @click.stop="iconClick(data, node, 3)">
  40. </i>
  41. <i class="iconfont icon-icon-shuju3"
  42. @click.stop="iconClick(data, node, 4)">
  43. </i>
  44. </span>
  45. </div>
  46. </el-tree>
  47. </el-scrollbar>

el-scrollbar:el-scrollbar滚动条组件在官网文章中没有介绍源码中是有的,要注意的是el-scrollbar需要指定高度,该元素的内容就是滚动条要包裹的内容;

el-tree的属性和事件官网都有注释,在这里主要解释一下几点:

        node-key:树节点用来作为唯一标识的属性,正常情况下设置数据的id; 

        filter-node-method:对树节点筛选执行的方法; 

        node-click:节点被点击时的回调事件;

        slot-scope="{ node, data }":自定义树节点内容;

        default-expanded-keys:默认展开的节点的key数组;

        setCurrentKey:el-tree控件自身方法,参数(key) 为被选节点的 key,若为 null 则取消当前高亮的节点,通过 key 设置某个节点的当前选中状态,使用此方法必须设置 node-key 属性

 data定义的数据:

  1. data() {
  2. return {
  3. currentNode: null,//当前节点数据
  4. treeData: [],//树节点数据
  5. defaultProps: {//配置选项
  6. children: "children",//子树为节点对象的children属性值
  7. label: "name",//节点标签为节点对象的name属性值
  8. },
  9. }
  10. },

关键字过滤树节点数据事件: watch监控关键字变化执行过滤事件,返回的数据为符合条件的节点树结构;

  1. watch: {
  2. keywords(val) {
  3. this.$refs.treeRef.filter(val);
  4. },
  5. },
  1. filterNode(value, data, node) {
  2. if (!value) return true;
  3. // return node.label.indexOf(value) !== -1;
  4. //此处过滤只返回符合条件的节点,之后代码返回符合条件的节点树结构,根据需求自行选择
  5. let arr = [];
  6. this.getReturnNode(node,arr,value)
  7. let result = false
  8. arr.forEach(v=>{
  9. result = result || v
  10. })
  11. return result
  12. },
  13. getReturnNode(node,arr,value){
  14. let pass = node.data&&node.label.indexOf(value) !== -1
  15. pass? arr.push(pass) : ''
  16. if(!pass && node.level != 1 && node.parent){
  17. this.getReturnNode(node.parent,arr,value)
  18. }
  19. },

 鼠标移入移出显示操作项事件:

  1. labelHoverLeave(event, node, data) {
  2. this.$set(node, "showIcon",false );
  3. },
  4. labelHover(event, node, data) {
  5. this.$set(node, "showIcon", true);
  6. },

树节点点击事件:回调参数有event,该节点对应对象数据,节点对应的Node,节点组件本身数据

  1. nodeClick(data, node, item) {
  2. //根据需求自行写入
  3. }

节点操作项事件:

  1. iconClick(data, node, index) {
  2. this.currentNode = node
  3. if (index == 1) { // 添加子数据
  4. this.$prompt('请输入节点名称', '添加子节点', {
  5. confirmButtonText: '确定',
  6. cancelButtonText: '取消',
  7. inputValue: '',
  8. inputPattern: /.{3}$/,
  9. inputErrorMessage: '请输入节点名称,不少于3个字'
  10. }).then(({ value }) => {
  11. //调取接口执行添加事件
  12. this.$message.success('添加成功!')
  13. this.getTreeData()//添加成功之后更新树控件数据
  14. }).catch(() => {});
  15. } else if (index == 2) { // 编辑
  16. this.$prompt('请输入节点名称', '编辑子节点', {
  17. confirmButtonText: '确定',
  18. cancelButtonText: '取消',
  19. inputValue: node.label,
  20. inputPattern: /.{3}$/,
  21. inputErrorMessage: '请输入节点名称,不少于3个字'
  22. }).then(({ value }) => {
  23. //调取接口执行编辑事件
  24. this.$message.success('编辑成功!')
  25. this.getTreeData()//编辑成功之后更新树控件数据
  26. }).catch(() => {});
  27. } else if (index == 3) { // 删除
  28. if (node.childNodes.length > 0) {
  29. this.$message.warning("存在下级子设施,无法删除!");
  30. return false;
  31. }
  32. this.$confirm('确认删除该节点?', '提示信息').then(() => {
  33. //调取接口执行删除事件
  34. this.$message.success('删除成功!')
  35. this.currentNode = null
  36. this.getTreeData()//删除成功之后更新树控件数据
  37. }).catch(()=>{})
  38. }else{}
  39. },

默认展开第一个节点数据:default-expanded-keys和setCurrentKey都可以实现该效果,且刷新数据后需要保留之前展开状态

  1. async getTreeData () {
  2. const { result } = await this.$api[xxx]()//调取接口树控件数据
  3. if (!result) {
  4. this.$message.error('数据错误,请联系管理员!')
  5. return
  6. }
  7. this.treeData = result || []
  8. let id = this.currentNode?.data?.id?
  9. this.currentNode.data.id: this.treeData.length>0?
  10. this.findTree(this.treeData).id : -1;
  11. //编辑新增刷新数据保留之前节点展开状态
  12. this.$nextTick(() => {
  13. this.$refs.treeRef.setCurrentKey(id)
  14. //通过 keys 设置目前勾选的节点,使用此方法必须设置 node-key 属性,
  15. //也可以根据default-expanded-keys设置
  16. });
  17. },
  18. findTree(array) {//递归返回第一个树节点的数据
  19. if (!array[0].children||array[0]?.children?.length==0) {
  20. return {
  21. id:array[0].id,
  22. name:array[0].name,
  23. }
  24. } else {
  25. return this.findTree(array[0].children);
  26. }
  27. },

css样式设置:

  1. .treeWrap{
  2. height: 100%;
  3. width: 260px;
  4. ::v-deep(.el-scrollbar__bar.is-horizontal){
  5. display: none;
  6. }
  7. ::v-deep .el-scrollbar__wrap {
  8. overflow-x: hidden !important;
  9. }
  10. .treeSearch{
  11. width:250px;
  12. padding:10px 0px 10px 8px;
  13. position:fixed;
  14. background:#fff;
  15. z-index:2000
  16. }
  17. .el-tree{
  18. padding-top: 60px;
  19. .custom-tree-node{
  20. flex: 1;
  21. min-width: 0;
  22. display: flex;
  23. height: 32px;
  24. align-items: center;
  25. justify-content: space-between;
  26. padding-right: 8px;
  27. height: 100%;
  28. box-sizing: border-box;
  29. .showIcon {
  30. right: 10px;
  31. padding-right: 2px;
  32. z-index: 1000;
  33. background-color: #f0f7ff;
  34. }
  35. .labelName{
  36. flex: 1;
  37. white-space: nowrap;
  38. overflow: hidden;
  39. text-overflow: ellipsis;
  40. padding: 2px 0px !important;
  41. box-sizing: border-box;
  42. }
  43. }
  44. }
  45. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号