VUE 无限层级树形数据结构显示的实现

 更新时间:2021年07月01日 09:59:25   作者:这个少年有点热丶  
在做项目中,会遇到一些树形的数据结构,常用在左侧菜单导航,本文就介绍一下如何实现,感兴趣的可以了解一下

在做项目中,会遇到一些树形的数据结构,常用在左侧菜单导航,或者评论引用等地方,这种数据结构有个特点是不知道它会嵌套多少层,所以用template去展示这样的数据时就有点棘手,这篇文章梳理两种展示这种数据结构的方法。

文章中用到的数据是下面这个:

mainData: {
  value: "root",
  children:[{
    value: "层级1-1",
    children:[{
      value: "层级2-1",
      children:[{
          value: "层级3-1",
          children:[]
       }]
     },{
       value: "层级2-2",
       children:[]
     }]
   },{
      value: "层级1-2",
      children:[]
   }]
}

也就是下面这个样子。

组件递归调用

第一种是组件递归调用自己的方式,创建一个组件,该组件在引用自己去展示children的数据,子组件如下:

<template>
<div>
  <div class="demo">
    {{treeData.value}}
    <tree-comp v-for="(item, index) in treeData.children" :treeData="item"></tree-comp>
  </div>
</div>
</template>
<script>
export default {
  name: 'treeComp',
  props:{
    treeData: {
      default: function(){
        return {}
      }
    }
  },
  mounted(){},
  methods:{}
}
</script>
<style lang="less" scoped>
  .demo{padding:5px 0;margin:1px 10px;text-align: left;font-size:16px;max-width:500px;border-left:1px dashed #999;
    &:before{content:'--';display: inline-block;padding:0 4px;}
  }
</style>

然后创建父组件,父组件使用子组件,并将数据传入子组件。

<template>
  <tree-comp :treeData="mainData"></tree-comp>
</template>
<script>
export default {
  name: 'treeMain',
  data () {
    return {
      mainData: {
        value: "root",
        children:[
          {
            value: "层级1-1",
            children:[{
              value: "层级2-1",
              children:[{
                value: "层级3-1",
                children:[]
              }]
            },{
              value: "层级2-2",
              children:[]
            }]
          },{
            value: "层级1-2",
            children:[]
          }
        ]
      }
    }
  },
  components:{
    "tree-comp": () =>  import('./TreeComp')
  },
  mounted(){},
  methods:{}
}
</script>

关于递归组件的内容,在官方文档里是有提到的-->递归组件

使用render方法

除了使用组件的方式,也可以使用vue的render方法,去利用JavaScript 的完全编程的能力,实现递归处理树形数据,从而展示出无限层级树。如下:

<template>
  <tree-comp :treeData="mainData"></tree-comp>
</template>
<script>
export default {
  name: 'treeRender',
  data () {
    return {
      mainData: {
        value: "root",
        children:[
          {
            value: "层级1-1",
            children:[{
              value: "层级2-1",
              children:[{
                value: "层级3-1",
                children:[]
              }]
            },{
              value: "层级2-2",
              children:[]
            }]
          },{
            value: "层级1-2",
            children:[]
          }
        ]
      }
    }
  },
  components:{
    treeComp:{
      functional: true,
      props: {treeData: Object},
      render(h, {props: {treeData = {}}}) {
        const creatNode = (node)=>{
          if(node.children && node.children.length > 0){
            let hArr = node.children.map(item=>{
              return creatNode(item)
            })
            return h('div', {class:'demo'}, [node.value, hArr])
          }else{
            return h('div', {class:'demo'}, [node.value])
          }          
        }
        return creatNode(treeData)
      },
    }
  },
  mounted(){},
  methods:{}
}
</script>
<style lang="less" scoped>
  .demo{padding:5px 0;margin:1px 10px;text-align: left;font-size:16px;max-width:500px;border-left:1px dashed #999;
    &:before{content:'--';display: inline-block;padding:0 4px;}
  }
</style>

其中最核心的就是在render方法里,creatNode方法用递归的方式,深度优先遍历树状数据,生成vnode,然后渲染出了页面。

到此这篇关于VUE 无限层级树形数据结构显示的实现的文章就介绍到这了,更多相关VUE 无限层级树形结构内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • element table数据量太大导致网页卡死崩溃的解决办法

    element table数据量太大导致网页卡死崩溃的解决办法

    当页面数据过多,前端渲染大量的DOM时,会造成页面卡死问题,下面这篇文章主要给大家介绍了关于element table数据量太大导致网页卡死崩溃的解决办法,需要的朋友可以参考下
    2023-02-02
  • Vue采用异步渲染的原理分析

    Vue采用异步渲染的原理分析

    对于Vue为何采用异步渲染,简单来说就是为了提升性能,因为不采用异步更新,在每次更新数据都会对当前组件进行重新渲染,为了性能考虑,Vue会在本轮数据更新后,再去异步更新视图,本文主要通过几个实例给大家介绍一下Vue为何采用异步渲染,需要的朋友可以参考下
    2023-06-06
  • 解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)

    解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等)

    这篇文章主要介绍了解决vue this.$forceUpdate() 处理页面刷新问题(v-for循环值刷新等),解决方法是使用this.$forceUpdate()强制刷新,文章给大家分享了代码案例,需要的朋友参考下吧
    2018-07-07
  • vue轮播图插件vue-concise-slider的使用

    vue轮播图插件vue-concise-slider的使用

    这篇文章主要介绍了vue轮播图插件vue-concise-slider的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • vue.js前后端数据交互之提交数据操作详解

    vue.js前后端数据交互之提交数据操作详解

    这篇文章主要介绍了vue.js前后端数据交互之提交数据操作,结合实例形式较为详细的分析了vue.js前后端数据交互相关的表单结构、约束规则、数据提交等相关操作技巧与注意事项,需要的朋友可以参考下
    2018-04-04
  • Vue3中如何使用异步请求示例详解

    Vue3中如何使用异步请求示例详解

    Vue3增加了很多让人眼前一亮的特征,suspense 组件就是其中之一,对处理异步请求数据非常实用,下面这篇文章主要给大家介绍了关于Vue3中如何使用异步请求的相关资料,需要的朋友可以参考下
    2022-06-06
  • vue3.0之Router的使用你了解吗

    vue3.0之Router的使用你了解吗

    这篇文章主要为大家详细介绍了vue3.0之Router的使用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 修改vue源码实现动态路由缓存的方法

    修改vue源码实现动态路由缓存的方法

    这篇文章主要介绍了修改vue源码实现动态路由缓存的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • vue项目打包清除console.log的4种方法

    vue项目打包清除console.log的4种方法

    项目打包的时候想要删除console.log,本文主要介绍了vue项目打包清除console.log的4种方法,具有一定的参考价值,感兴趣的可以了解游戏
    2023-11-11
  • Vue.js组件使用props传递数据的方法

    Vue.js组件使用props传递数据的方法

    这篇文章主要为大家详细介绍了Vue.js组件使用props传递数据的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10

最新评论