vuejs递归组件

vuejs学习--递归组件

前言

  学习vue有一段时间了,最近使用vue做了一套后台管理系统,其中使用最多就是递归组件,也因为自己对官方文档的不熟悉使得自己踩了不少坑,今天写出来和大家一起分享。

递归组件

  组件在它的模板内可以递归地调用自己,只有当它有 name 选项时才可以。 在官网这句话就是关键定义组件是一定要有name属性。按照这个思路我们开动吧。

  实现最终效果图:

    

  模拟数据格式如下:

    

var data = [{
                "id": "1",
                "data": {
                    "menuName": "项目管理",
                    "menuCode": "",
                },
                "childTreeNode": [{
                    "data": {
                        "menuName": "项目",
                        "menuCode": "BusProject",
                    },
                    "childTreeNode": []
                }, {
                    "data": {
                        "menuName": "我的任务",
                        "menuCode": "BusProject",
                    },
                    "childTreeNode": []
                }, {
                    "data": {
                        "menuName": "人员周报",
                        "menuCode": "BusProject",
                    },
                    "childTreeNode": []
                }]
            }, {
                "id": "2",
                "data": {
                    "menuName": "数据统计",
                    "menuCode": "BusClock",
                },
                "childTreeNode": []
            }, {
                "id": "3",
                "data": {
                    "menuName": "人事管理",
                    "menuCode": "",
                },
                "childTreeNode": []
            }, {
                "id": "4",
                "data": {
                    "menuName": "基础管理",
                    "menuCode": "",
                },
                "childTreeNode": []
            }]

html我们思路按照ul里面套li,无限ul套li,标题用div元素包裹,

<li>
    <div @click=‘toggle‘>  
         <i v-if=‘isFolder‘ class="fa " :class="[open?‘fa-folder-open‘:‘fa-folder‘]"></i>     <!--isFolder判断是否存在子级改变图标-->
         <i v-if=‘!isFolder‘ class="fa fa-file-text"></i> {{model.data.menuName}}
     </div>
     <ul v-show="open" v-if=‘isFolder‘>
          <items v-for=‘cel in model.childTreeNode‘ :model=‘cel‘></items>
     </ul> </li>

官方文档里面写的递归组件强调了使用name属性

export default {
    name: ‘items‘,
    props: [‘model‘],
    components: {},
}

按照vue的思想,不操作Dom树,我们定义两个变量,一个显示隐藏子菜单(open),一个存不存子菜单修改图标(isFolder)。

data() {
        return {
             open: false,
             isFolder: true
        }
}

利用vue计算属性动态改变isFolder的值,修改图标,判断存在不子级和子级长度

computed: {
    isFolder() {
        return this.model.childTreeNode && this.model.childTreeNode.length
    }
}        

显示隐藏事件

methods: {  toggle: function() {
      if(this.isFolder) {
          this.open = !this.open
      }
  }}

写到这里我们已经做完一个树形菜单了如下,最终样式就留给大家自己去实现了我在贴出完整代码供大家参考。

<template>
    <li>
        <div @click=‘toggle‘>
            <i v-if=‘isFolder‘ class="fa " :class="[open?‘fa-folder-open‘:‘fa-folder‘]"></i>
            <!--isFolder判断是否存在子级改变图标-->
            <i v-if=‘!isFolder‘ class="fa fa-file-text"></i> {{model.data.menuName}}
        </div>
        <ul v-show="open" v-if=‘isFolder‘>
            <items v-for=‘cel in model.childTreeNode‘ :model=‘cel‘></items>
        </ul>
    </li>
</template>
<script type="text/javascript">
    export default {
        name: ‘items‘,
        props: [‘model‘],
        components: {},
        data() {
            return {
                open: false,
                isFolder: true
            }
        },
        computed: {
            isFolder: function() {
                return this.model.childTreeNode && this.model.childTreeNode.length
            }
        },
        methods: {
            toggle: function() {
                if(this.isFolder) {
                    this.open = !this.open
                }
            },
        }
    }
</script>

公司最开始是使用easyui做的管理系统,我接手后用vue完整模仿了一些easyui的东西,下面就是在树形菜单基础上模仿出了树形表格,对此感兴趣或者需要的可以联系我。下图为完整图

分类: JavaScript

时间: 2024-12-26 06:43:11

vuejs递归组件的相关文章

递归组件

递归组件 组件在它的模板内可以递归地调用自己,只有当它有 name 选项时才可以. 在官网这句话就是关键定义组件是一定要有name属性.按照这个思路我们开动吧. 实现最终效果图: 模拟数据格式如下: var data = [{ "id": "1", "data": { "menuName": "项目管理", "menuCode": "", }, "child

vue2 递归组件--树形学习分享

今天看了老长时间递归组件,官方给的教程太简便了,根本看不出到底怎么用.于是自己查网摸索了一下,这儿只把核心思想写出来. 效果如下图,点击后打开二级菜单,再点击后打开三级. //js //引子aaa:{ //组件名字aaa,挂载到components中的. name:'aa', template:` <div>组件</div> <aa></aa>` //其实这儿就已经是递归调用了,只要在html中使用但是会无限循环下去.所以就需要一个结束点.这个结束点怎么给?

Vue两种组件类型介绍:递归组件和动态组件

一递归组件 递归组件的特性就是可以在自己的template模板中调用自己本身.值得注意的它必须设置name属性. // 递归组件 recursive.vue <template> <div> <p>递归组件</p> <Recursion :count="count + 1" v-if="count < 3"></Recursion> </div> </template&g

Vue组件的操作-自定义组件,动态组件,递归组件

作者 | Jeskson 来源 | 达达前端小酒馆 v-model双向绑定 创建双向数据绑定,v-model指令用来在input,select,checkbox,radio等表单控件.v-model指令在内部使用不同的属性为不同的输入元素抛出不同的事件. v-mdel指令实现数据的双向绑定: <div> 用户名:<input type="text" v-model="name"> </div> 输入用户名是:{{name}} &l

vue+elementUI 做的递归组件

废话少说,直接上最新鲜的干货 当然,你得提前安装好bootstrap,router,element-ui,vue-axios 1.上递归组件,此处参考了某位大神的代码,具体不知道是谁,因为到处都有人用 <template> <div> <template v-for='menu in menuList'> <!-- 如果当前有子菜单,则显示 el-submenu ,在el-subment 里调用 递归组件 --> <el-submenu v-if='m

vue递归组件 (树形控件 )

首先我们要知道,既然是递归组件,那么一定要有一个结束的条件,否则就会使用组件循环引用,最终出现“max stack size exceeded”的错误,也就是栈溢出.那么,我们可以使用v-if="判断条件"作为递归组件的结束条件.当遇到v-if为false时,组件将不会再进行渲染 1. 准备一个树状的递归数据 navigation: [ { types: 1, id: "0", name: "首页", path: "/jiaowu_sy

依赖注入、递归组件的用法

处理边界情况 $root 用来访问根组件 $parent 用来从一个子组件访问父组件的实例 ref 和 $refs 的用法 在组件上面使用 ref 这个属性绑定,属性值自取,然后就可以通过 $refs.属性名 这种方式去获取到指定组件的实例了. 其实不仅仅是组件能够使用 ref ,标签元素也能使用. 依赖注入 现在我们有一个需求,如果我们存在多个组件嵌套的,然后现在其中某一个组件想访问其曾祖父组件的方法,那么使用上面两种方式都是不可取的,这个时候官方提供了 provide 和 inject 这两

谈谈Vue的递归组件

2月最后一天,而且还四年一遇,然而本月居然一篇博客没写,有点说不过去.所以,今天就来谈谈Vue的递归组件.我们先来看一个例子: See the Pen 递归组件 by imgss (@imgss) on CodePen. 什么是递归组件 上面这个例子,就是用递归组件实现的.递归组件,顾名思义,就是自己的内部实现又调用自己的组件.比如Vue官方给的treeView的例子,父目录下有子目录,子目录下还有子目录,子子孙孙,无穷尽也.就像俄罗斯套娃. 代码结构大概长下面这样子,需要注意递归组件与一般组件

vue递归组件的一些理解

自己做个小项目练手,需要用到组件递归,网上查了一些资料,每个代码片段都认识,但是连起来,就一团浆糊. 既然人傻就多思考吧.不明白的点有以下: 1.组件怎么自己调用自己,函数的递归是就是在function fn(){ fn() },组件的递归没有看到这样子的呀. 答:组件中使用name属性,给组件自己定义个名字,这样在组件中就可以自己调用自己了.就像在函数中直接调用函数名来来递归. 2.组件的递归中一层又一层数据是如何获取到的? 答:将嵌套的数据重新赋值给prop设置的属性. <tree-menu