前言

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

递归组件

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

模拟数据格式如下:

[
{
"id": "1",
"menuName": "基础管理",
"menuCode": "10",
"children": [
{
"menuName": "用户管理",
"menuCode": "11"
},
{
"menuName": "角色管理",
"menuCode": "12",
"children": [
{
"menuName": "管理员",
"menuCode": "121"
},
{
"menuName": "CEO",
"menuCode": "122"
},
{
"menuName": "CFO",
"menuCode": "123"
},
{
"menuName": "COO",
"menuCode": "124"
},
{
"menuName": "普通人",
"menuCode": "124"
}
]
},
{
"menuName": "权限管理",
"menuCode": "13"
}
]
},
{
"id": "2",
"menuName": "商品管理",
"menuCode": ""
},
{
"id": "3",
"menuName": "订单管理",
"menuCode": "30",
"children": [
{
"menuName": "订单列表",
"menuCode": "31"
},
{
"menuName": "退货列表",
"menuCode": "32",
"children": []
}
]
},
{
"id": "4",
"menuName": "商家管理",
"menuCode": "",
"children": []
}
]
html我们思路按照ul里面套li,无限ul套li,标题用div元素包裹,

<template>
<li>
<span @click="toggle"> <!-- toggle:点击关闭展开 -->
<i v-if="isFolder" class="icon" :class="[open ? 'folder-open' : 'folder']" @cilck="toggle"></i>
<!-- <i v-if="isFolder" class="icon " :class="[open ? 'folder-open' : 'folder']"></i> -->
<i v-if="!isFolder" class="icon folder-text"></i>
{{model.menuName}}
</span>
<ul v-show="open" v-if="isFolder">
<treeMenu v-for="item in model.children" :model="item"></treeMenu>
</ul>
</li>
</template>
官方文档里面写的递归组件强调了使用name属性

需要注意的是,由父组件传递过来的数据要先进行深拷贝哦
深拷贝:把props赋值到data里,赋值的同时深拷贝一下,data里 JSON.parse(JSON.stringify(这个值就行了)),data值自己命名


export default {
name: 'treeMenu',
//props: ['model'], //这样和下面效果一样
props: {
model: { type: Object },
},
components: {},
}
按照vue的思想,不操作Dom树,我们定义两个变量,一个显示隐藏子菜单(open),一个存不存子菜单修改图标(isFolder)。

data() {
return {
open: false, //一个显示隐藏子菜单(open)
//isFolder: true //这个不要写死,运用计算属性计算看存不存在
}
},
利用vue计算属性动态改变isFolder的值,修改图标,判断存在不子级和子级长度

computed: {
isFolder() { //利用vue计算属性动态改变isFolder的值,修改图标,判断存在不子级和子级长度
// return this.model.children && this.model.children.length //和下面效果一样
let isFolder = false
if (this.model.children && this.model.children.length) {
isFolder = true;
} else {
isFolder = false;
}
return isFolder
}
},
显示隐藏事件

methods: {
toggle() {
if (this.isFolder) {
this.open = !this.open
}
}
},
写到这里我们已经做完一个树形菜单了

原文地址:https://segmentfault.com/a/1190000012806447

vuejs--递归组件(树型表格分享)的更多相关文章

  1. vuejs学习--递归组件(树型表格分享)

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

  2. vuejs递归组件

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

  3. SQL递归获取树型路径中文名称

    项目中遇到一个树型结构表要根据任意传入节点获取它从根节点一直到自身节点的全部路径的中文名称,并且用'>'与分隔. 我使用在sqlServer中写了一个解析函数方便开发调用. USE [RP_ER ...

  4. JavaScript:使用递归构建树型菜单

    使用递归函数将扁平数据转为树型结构,并渲染到页面 效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> ...

  5. 玩转web之ligerui(二)---前缀编码生成树(分级码)实现树型表格

    请珍惜小编劳动成果,该文章为小编原创,转载请注明出处. 背景:             在ligerui中(其他uI可能也大同小异),实现树形表格可以通过父子节点,也可以通过前缀编码生成树去实现,而使 ...

  6. vue.js 树菜单 递归组件树来实现

    树形视图 Example: https://vuefe.cn/v2/examples/tree-view.html 参照前辈方法实现的,觉得不错,记录一下: 父组件: <!-- 菜单树 --&g ...

  7. 基于element-tree-table树型表格点击节点请求数据展开树型表格

    效果: 引用CSS.JS: Vue.element-ui.Axios treeTable: https://github.com/ProsperLee/element-tree-grid 模拟根据父i ...

  8. 递归系列——树型JSON数据转换问题

    JSON数据转换方式: 1.标准结构=>简单结构 var root = { id: 'root', children: [ { id: "1", children: [ { ...

  9. Vue.js示例:树型视图; 模式组件;

    树型图 本示例是一个简单的树形视图实现,它展现了组件的递归使用. mycode pen:https://codepen.io/chentianwei411/pen/KGKQxE 重点:递归是如何形成的 ...

随机推荐

  1. node——npm

    npm 1.npm是nodejs的包管理器 2.npm 有很多代码仓库和代码模块 3.npm有一个npm客户端 4.npm本身也是基于Node.js开发的包 5.npm install npm@lat ...

  2. How Many Partitions Does An RDD Have

    From https://databricks.gitbooks.io/databricks-spark-knowledge-base/content/performance_optimization ...

  3. KVM虚拟机相关步骤

    KVM是Kernel-based Virtual Machine的简称,是一个开源的虚拟化模块,该文档是基于CentOS 7.4环境操作的 一.操作系统安装 本文采用的是CentOS 7.4 1.查看 ...

  4. Git 合并流程

    首先把自己的代码提交到自己的分支 再把master[主分支]的代码拉下来更新 解决冲突 推送至自己的分支 请求合并到master[主分支]

  5. 让前端攻城师独立于后端进行开发: Mock.js

    一.Mock.js是什么? 目前的大部分公司的项目都是采用的前后端分离, 后端接口的开发和前端人员是同时进行的. 那么这个时候就会存在一个问题, 在页面需要使用大量数据进行渲染生成前, 后端开发人员的 ...

  6. 使用xpath进行熟悉href属性

    HTML文档 <html> <body> <a href="http://www.example.com">Example</a> ...

  7. React入门基础

    1-react概念: React是一个用于构建用户界面的JavaScript库.React主要用于构建UI,很多人认为React是MVC中的V(视图).React起源于Facebook的内部项目.Re ...

  8. HDU 1023

    卡特兰数.把进栈看成是+1,出栈看成是-1,任何时候部分和都有a1+a2+....ak>=0.求这样的数列的个数.这明显是卡特兰数的一个解释嘛.在<组合数学>这本书就有这样的原本的证 ...

  9. [Angular] Read Custom HTTP Headers Sent by the Server in Angular

    By default the response body doesn’t contain all the data that might be needed in your app. Your ser ...

  10. FPGA视频拼接器的放大和缩小功能

    视频视频器能够把信号源放大和缩小. 对于我们的拼接器而言,它的架构这种: 信号源进入到拼接器中.先进入缩小模块.然后存进DDR中.然后从DDR中读出视频.进入到放大模块,最后依据屏幕的位置,输出到屏幕 ...