vue 目录树的展开与关闭的实现

 更新时间:2023年11月24日 10:07:40   作者:Ann_R  
Vue作为一款流行的前端框架,提供了一种数据驱动的方式来实现目录树,本文主要介绍了vue 目录树的展开与关闭的实现,具有一定的参考价值,感兴趣的可以了解一下

本文主要介绍了 vue 目录树的展开与关闭,具体如下:

<el-tree
    :data="data_option"
    ref="tree"
    :props="defaultProps"
    @node-click="handleNodeClick"
    :default-expanded-keys="needExpandedKeys"
    node-key="type_id"
    highlight-current
  >
</el-tree>


expandedKeys: [], //所有treenode的id
needExpandedKeys: [], //需要展开的treenode的id数组
needExpandedNodes:[],//需要展开的treenode的node数组

关键在于以下两行代码

 :default-expanded-keys="needExpandedKeys"  // needExpandedKeys数组,用来保存展开节点的唯一值
 node-key="type_id"  //每个节点的唯一值,这里我的唯一值是type_id

data_option 数组如果没有这个唯一值怎么办,给它加一个

//list 是目录树节点以及目录树节点下的文件所组成的一个数组
this.data_option = this.addTypeIdToTreeNode(list);  

addTypeIdToTreeNode(lastList) {
      //传进去的list是有tree又有file
      //给每个node节点添加type_id,用来展开目录设置唯一值
      let treeData = lastList;
      const addIdToTree = (treeData) => {
        return treeData.map((node, index) => {
          if (!node._id) {  //根据自己目录树数组的实际情况修改,因为我这个_id有用所以需要判断
            const newNode = {
              ...node,
              type_id: node.type_code == 0 ? "wfl000" : node.type_code,
            }; // 创建一个新的节点,包括原有的属性和新的 _id 属性
            if (node.childrens && node.childrens.length > 0) {
              newNode.childrens = addIdToTree(node.childrens); // 递归处理子节点
            }
            return newNode;
          } else {
            const newNode = { ...node, type_id: node._id }; // 创建一个新的节点,包括原有的属性和新的 _id 属性
            return newNode;
          }
        });
      };
      const treeDataWithId = addIdToTree(treeData);
      let str = [];
      const getStr = function (list) {
        list.forEach(function (row) {
          if (row.childrens) {
            str.push(row.type_id);
            getStr(row.childrens);
          } else {
            str.push(row.type_id);
          }
        });
      };
      getStr(treeDataWithId);
      this.expandedKeys = str;
      // console.log("需要展开的treenode", this.expandedKeys);
      // console.log("需要展开的treeDataWithId", treeDataWithId);
      return treeDataWithId;
    },

1、翻页方法中控制目录树节点的展开与关闭

this.$nextTick(() => {
   this.$refs.tree.setCurrentKey(
     this.userArr[0].type_id  //高亮当前节点,type_id 唯一值确定节点
   );
   //展开高亮文件的目录
   this.expandedKeys.forEach((node) => {
     if (
      //this.indexLocation 翻页之后是a文件,a文件的下标
       this.userArr[this.indexLocation].type_id.indexOf(node) !== -1  
     ) {
       this.needExpandedKeys.push(node);
     }
   });
   this.needExpandedKeys.forEach((node) => {
     this.$refs.tree.store.setCheckedNodes([node], true);
   });
 });

2、搜索目录树节点名称控制节点的展开与关闭

//搜索
    goToSearch(){
      let treedata = this.data_option
      if(this.searchStr){
        //需要关闭所有节点 //除了上次搜索展开的节点还有自己点击展开的节点
        this.changeTreeNodeStatus(this.$refs.tree.store.root)
        this.needExpandedNodes = []
        this.needExpandedKeys = []
        //获取需要展开的节点数组
        this.findTypeCode(treedata, this.searchStr)
        this.needExpandedNodes.forEach(item=>{
          this.needExpandedKeys.push(item.type_id)
        })
        if(this.needExpandedKeys.length == 0){
          this.$message.error("没有找到您搜索的目录节点")
        }else{
          //模拟点击该节点,使其高亮,默认高亮搜索出的第一个节点
          this.handleNodeClick(this.needExpandedNodes[0],this.$refs.tree.getNode(this.needExpandedKeys[0]))
        }
        console.log("needExpandedKeys",this.needExpandedKeys)
      }else{
        this.changeTreeNodeStatus(this.$refs.tree.store.root)
        this.needExpandedNodes = []
        this.needExpandedKeys = []
      }
      
    },
    //循环拿到需要展开的目录子节点
    findTypeCode(treeData, targetName) {
      // 遍历树结构
      for (let i = 0; i < treeData.length; i++) {
        const node = treeData[i];
        // 如果节点的 type_name 包含目标名称,返回该节点的 type_code
        if (node.type_name.includes(targetName)) {
        // if (node.type_name==targetName) {
          console.log(node.type_id)
          if(node.type_id){
            this.needExpandedNodes.push(node)
          }
        }
        
        // 如果节点有子节点,递归调用自身进行深度优先搜索
        if (node.childrens && node.childrens.length > 0) {
          const result = this.findTypeCode(node.childrens, targetName);
          
          // 如果在子树中找到了匹配的节点,返回结果
          if (result) {
            return result;
          }
        }
      }
      // 如果没有找到匹配的节点,返回 null 或者适合您的默认值
      return null;
    },
    changeTreeNodeStatus(node) {
      node.expanded = false
      for (let i = 0; i < node.childNodes.length; i++) {
        // 改变节点的自身expanded状态
        node.childNodes[i].expanded = this.defaultExpand
        // 遍历子节点
        if (node.childNodes[i].childNodes.length > 0) {
          this.changeTreeNodeStatus(node.childNodes[i])
        }
      }
    },

记录一个比较重要的点:高亮某行目录树节点

this.handleNodeClick(this.needExpandedNodes[0],this.$refs.tree.getNode(this.needExpandedKeys[0]))

//即:
this.handleNodeClick(node, this.$refs.tree.getNode(node))
//node为 目录树的一个节点,在我这儿比如data_option数组中的某个对象

到此这篇关于vue 目录树的展开与关闭的实现的文章就介绍到这了,更多相关vue 目录树 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

您可能感兴趣的文章:

相关文章

  • 基于vue中css预加载使用sass的配置方式详解

    基于vue中css预加载使用sass的配置方式详解

    下面小编就为大家分享一篇基于vue中css预加载使用sass的配置方式详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Vue中插槽slot的使用方法与应用场景详析

    Vue中插槽slot的使用方法与应用场景详析

    这篇文章主要给大家介绍了关于Vue中插槽slot的使用方法与应用场景的相关资料,插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性,需要的朋友可以参考下
    2021-06-06
  • vue2 自定义动态组件所遇到的问题

    vue2 自定义动态组件所遇到的问题

    这篇文章主要介绍了vue2 自定义 动态组件的实现方法,需要的朋友可以参考下
    2017-06-06
  • Vue函数式组件专篇深入分析

    Vue函数式组件专篇深入分析

    Vue提供了一种称为函数式组件的组件类型,用来定义那些没有响应数据,也不需要有任何生命周期的场景,它只接受一些props来显示组件,下面这篇文章主要给大家介绍了关于Vue高级组件之函数式组件的使用场景与源码分析的相关资料,需要的朋友可以参考下
    2023-01-01
  • Vue学习之Vuex的使用详解

    Vue学习之Vuex的使用详解

    这篇文章主要介绍了Vue中的插件:Vuex。本文将围绕它的优缺点、使用场景和示例展开详细的说明,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-01-01
  • vue项目前端加前缀(包括页面及静态资源)的操作方法

    vue项目前端加前缀(包括页面及静态资源)的操作方法

    这篇文章主要介绍了vue项目前端加前缀(包括页面及静态资源)的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-12-12
  • vue使用富文本编辑器vue-quill-editor的操作指南和注意事项

    vue使用富文本编辑器vue-quill-editor的操作指南和注意事项

    vue中很多项目都需要用到富文本编辑器,在使用了ueditor和tinymce后,发现并不理想,所以果断使用vue-quill-editor来实现,下面这篇文章主要给大家介绍了关于vue使用富文本编辑器vue-quill-editor的操作指南和注意事项,需要的朋友可以参考下
    2023-05-05
  • VUE element上传动态设置action路径和参数的坑及解决

    VUE element上传动态设置action路径和参数的坑及解决

    这篇文章主要介绍了VUE element上传动态设置action路径和参数的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • el-tree的实现叶子节点单选的示例代码

    el-tree的实现叶子节点单选的示例代码

    本文主要介绍了el-tree的实现叶子节点单选的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • vue cli3.0打包上线静态资源找不到路径的解决操作

    vue cli3.0打包上线静态资源找不到路径的解决操作

    这篇文章主要介绍了vue cli3.0打包上线静态资源找不到路径的解决操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论