Vue.js递归组件实现动态树形菜单
使用Vue递归组件实现动态菜单
现在很多项目的菜单都是动态生成的,之前自己做项目也是遇到这种需求,翻看了官网案例,和网上大神的案例.只有两个感觉,官网的案例太简洁,没有什么注释,看起来不太好理解,大神们的作品又比较复杂,对于初学者来说理解起来还是有难度,自己捣鼓了几天,勉强理解了递归组件菜单的实现,这里结合官网的案例,把代码和注释附上.
如果你的项目是element-ui,其实它里面也有提供树形菜单,但是由于是别人封装的,所以使用起来没那么方便,大多数还是会自己配置,好了,不说那么多,还是回到递归组件上来吧
- 先来看一下菜单的最终效果,有+号的都是可以点击展开的
首先看一下项目的目录,在后台菜单数据没拿到之前,这里先演示一个模拟数据的,先在SRC文档下建一个data存放菜单数据.按照菜单层级关系写
数据里设置menuLevel是为了配置路由的,值是组件的名字
接着创建两个组件,一个是菜单父组件,一个是递归的子组件,父组件代码:
<template>
<div>
<ul id="demo">
<submenu
class="item"
:model="treeData">
</submenu>
</ul>
</div>
</template>
<script>
// 引入菜单数据
import data from '../../data/treeData'
// 引入子组件
import submenu from './submenu/submenu.vue'
export default {
components: {
submenu
},
name: 'treeMenu',
data () {
return {
treeData: data
}
}
}
</script>
<style scoped>
@import './treeMenu.scss';
</style>- 子组件代码,html部分:
<template>
<div>
<li>
<div
:class="{bold: isFolder}"
@click="toggle"
@dblclick="changeType">
<!-- 配置路由跳转 -->
<router-link :to="{ name: model.menuLevel }">{{ model.name }}</router-link> <span v-if="isFolder">[{{ open ? '-' : '+' }}]</span>
</div>
<ul v-show="open" v-if="isFolder">
<submenu
class="item"
v-for="(model, index) in model.children"
:key="index"
:model="model"> </submenu>
<!-- <li class="add" @click="addChild">+</li> -->
</ul>
</li>
</div>
</template>子组件代码,js部分:
// 引入子组件
import submenu from './submenu'
export default {
components: {
submenu
},
name: 'submenu',
props: {
model: Object
},
data: function () {
return {
open: false
}
},
computed: {
// 是否展示+图标
isFolder: function () {
return this.model.children &&
this.model.children.length
}
},
methods: {
// 单击展示子菜单
toggle: function () {
if (this.isFolder) {
this.open = !this.open
}
},
// 双击给当前单一不可展开的菜单添加children,变成可展开样式
changeType: function () {
if (!this.isFolder) {
// Vue.set(this.model, 'children', [])
this.$set(this.model, 'children', [])
this.addChild()
this.open = true
}
},
// 给子菜单添加内容
addChild: function () {
this.model.children.push({
name: 'new stuff'
})
}
}
}路由配置,这里的name和data数据里的menuLevel一样:
import Vue from 'vue'
import Router from 'vue-router'
// import OnePage from '@/components/OnePage/OnePage'
// 引入菜单组件
import treeMenu from '@/components/menu/treeMenu'
// 引入一级菜单
import one from '@/components/one/one'
// 引入二级菜单
import two from '@/components/two/two'
// 引入三级菜单
import three from '@/components/three/three' Vue.use(Router) export default new Router({
routes: [
// {
// path: '/',
// name: 'OnePage',
// component: OnePage
// }
{
path: '/',
name: 'treeMenu',
component: treeMenu
},
{
path: '/one',
name: 'one',
component: one
},
{
path: '/two',
name: 'two',
component: two
},
{
path: '/three',
name: 'three',
component: three
}
]
})这样一个树形菜单就大致完成了,配置了路由的也可以跳转到相应页面
,如果菜单数据是后台给你的,数据只要和你一开始设置data数据格式一样就可以直接用了
Vue.js递归组件实现动态树形菜单的更多相关文章
- 【Vue.js实战案例】- Vue.js递归组件实现组织架构树和选人功能
大家好!先上图看看本次案例的整体效果. 浪奔,浪流,万里涛涛江水永不休.如果在jq时代来实这个功能简直有些噩梦了,但是自从前端思想发展到现在的以MVVM为主流的大背景下,来实现一个这样繁杂的功能简直不 ...
- Vue.js 递归组件实现树形菜单
最近看了 Vue.js 的递归组件,实现了一个最基本的树形菜单. 项目结构: main.js 作为入口,很简单: import Vue from 'vue' Vue.config.debug = tr ...
- 用Vue.js递归组件构建一个可折叠的树形菜单
在Vue.js中一个递归组件调用的是其本身,如: Vue.component('recursive-component', { template: `<!--Invoking myself! ...
- Vue.js的组件(slot/动态组件等)、单文件组件、递归组件使用
一.组件 1> 组件命名方式有两种(注意:在DOM模板中只有kebab-case命名方法才生效): html中引用组件: <!-- 在DOM模板中,只有 kebab-case命名才生效 - ...
- 【Vue课堂】Vue.js 父子组件之间通信的十种方式
这篇文章介绍了Vue.js 父子组件之间通信的十种方式,不管是初学者还是已经在用 Vue 的开发者都会有所收获.无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽 ...
- 谈谈Vue的递归组件
2月最后一天,而且还四年一遇,然而本月居然一篇博客没写,有点说不过去.所以,今天就来谈谈Vue的递归组件.我们先来看一个例子: See the Pen 递归组件 by imgss (@imgss) o ...
- Vue.js多重组件嵌套
Vue.js多重组件嵌套 Vue.js中提供了非常棒的组件化思想,组件提高了代码的复用性.今天我们来实现一个形如 <app> <app-header></app-head ...
- Vue.js之组件传值
Vue.js之组件传值 属性传值可以从父组件到子组件,也可以从子组件到父组件. 这里讲一下从父组件到子组件的传值 还以上次的demo为例,demo里有APP.vue是父组件,Header.vue,Us ...
- Vue.js之组件嵌套小demo
Vue.js之组件嵌套的小demo项目 第一步:初始化一个wabpack项目,这里不在复述.第二步:在components文件夹下新建Header.vue Footer.vue和Users.vue三个 ...
随机推荐
- 03 MD5加密、Base64处理
1 什么是MD5 信息摘要算法,可以将字符进行加密,每个加密对象在进行加密后都是等长的 应用场景:将用户密码经过MD5加密后再存储到数据库中,这样即使是超级管理员也没有能力知道用户的具体密码是多少:因 ...
- Spark的广播变量模块
有人问我,如果让我设计广播变量该怎么设计,我想了想说,为啥不用zookeeper呢? 对啊,为啥不用zookeeper,也许spark的最初设计哲学就是尽量不使用别的组件,他有自己分布式内存文件系统, ...
- mysql双机热备份的实现步骤
MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾.备份.恢复.负载均衡等都是有极大帮助的.本文描述了常见的同步设置方法.<?xml:namespace prefix = o /> ...
- web 打印分页技巧
page-break-after 和 page-break-before: page-break-before和page-break-after CSS属性并不会修改网页在屏幕上的显示,这两个属性是 ...
- iOS 12中无法获取WiFi的SSID了?
1.现象描述 2018年苹果升级iOS12之后,没有办法获取wifi名称等信息. 2.获取wifi信息 2.1 获取代码 /************ 控制器的view 加载完毕 的时候调用 ***** ...
- timestamp 在curl中变成了Xtamp
目前的解决方案 将timestemp放在数组最前面. [注意:请求的参数中需要将timestamp这个参数放在数组的最前面,不然在GET方式请求中,会出现浏览器将它变成Xtamp,最终导致签名失败]
- 【Linux】-Ubuntu下配置JDK1.8
前言 这次实在是不想写前言了,好吧,那咱就不写了. 内容 怀着复杂的心情来整理这个小小的操作,其实我的内心是拒绝的,因为太简单了,但是我却花费了很长的时间,有效时间花费了将近两个小时去整理这个小玩意儿 ...
- web.xml 有什么用?(Java框架)
1.每个javaEE工程中都有web.xml文件,那么它的作用是什么呢?它是每个web.xml工程都必须的吗? 一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程 ...
- Java框架之spring 项目 附加之noteresult(status msg data uuid MD5)
1.1创建类 实体类 NoteResult<T> 注意<T> private int status; private String msg; private T dat ...
- 【转】如何知道DLL是32位还是64位
源地址:http://blog.csdn.net/skysword2/article/details/52588624