实战用例:管理后台–权限管理模块,多级菜单,菜单层级不固定
一、组件递归,页面渲染
数据渲染用组件递归(也可参考此博客)
菜单组件- -tree.vue:
<template>
<div>
<div v-for="(item,index) of list" class="level" :class="{'inline':item.items.length<=0 }">
<el-checkbox :label="item.id" :key="item.id" @change="changeRule(item)">{{item.name}}</el-checkbox>
<tree-menus :list="item.items"></tree-menus>//自己调用自己
</div>
</div>
</template>
<script>
import {bus} from './bus.js'
export default {
name:'treeMenus',//自己调用自己
props:['list',"rule"],
data(){
return {
}
},
methods:{
changeRule(item){
bus.$emit('getH', item)
}
}
}
</script>
调用组件- -menu.vue
<template>
<div class="app-container">
<el-checkbox class="checkAll" v-model="checkAll" @change="handleCheckAllChange">全选</el-checkbox>
<el-checkbox-group v-model="rule">
<tree-menu :list="list" :rule="rule"></tree-menu>
</el-checkbox-group>
<el-button type="primary" @click="onSubmit">确定</el-button>
</div>
</template>
<script>
import {rulelist,editRule } from '@/api/manage'
import treeMenu from "./tree"
import {bus} from './bus.js'
export default {
data(){
return {
list:[
{
name: "菜单1",
children: [
{
name: "菜单1-1",
children: []
}
]
}
],
rule:[],
}
}
}
二、组件递归后的传值(编辑权限)
使用组件递归之后不能使用
父子传值,不是普通的父子关系
新建一个bus.js文件
import Vue from 'vue'
export var bus = new Vue()
菜单组件- -tree.vue
import {bus} from './bus.js'
changeRule(item){
//给调用组件传值
bus.$emit('getH', item)
}
调用组件- -menu.vue
import {bus} from './bus.js'
created(){
//权限列表
this.getList();
//bus.$on获取菜单组件传过来的值
bus.$on('getH', (item) => {
this.rule=this.uniq(this.rule);
this.checkId(item);
})
},
methods:{
checkId(item) {
if(this.rule.indexOf(item.id)>-1){
console.log('存在');
this.addId(item.items,this.rule);
}else{
console.log('不存在');
this.delId(item.items,this.rule);
}
},
delId(arr,arrName){
arr.forEach((item) => {
arrName.forEach(item2=>{
if(item.id==item2){
let index=arrName.indexOf(item.id);
arrName.splice(index,1)
if (item.items.length > 0) {
this.delId(item.items,arrName);
}
}
})
})
return arrName;
},
addId(arr,arrName){
arr.forEach((item) => {
arrName.push(item.id);
if (item.items.length > 0) {
this.addId(item.items,arrName);
}
})
return arrName;
},
uniq(arr) {
return [...new Set(arr)]
},
}