[TOC]
Tree 组件具有 default-checked-keys 属性,值为数组,当 node-key 为 id 时,数组内存放的 id 对应的选项会被选择。
这时通过接⼝来请求当前⻆⾊拥有的菜单列表,接⼝地址。
// services/menu.js
…
// 获取⻆⾊拥有的菜单列表
export const getRoleMenus = roleId => {
return request({
method: ‘GET’,
// 下⾯两种⽅式均可
// url: /boss/menu/getRoleMenus?roleId=${roleId}
,
url: ‘/boss/menu/getRoleMenus’,
params: { // axios 会把 params 转换为 urlencoded 并以 ? 连接到 url 后
roleId
}
})
}
引⼊并调⽤
// alloc-menu.vue
..
import { getMenuNodeList, allocateRoleMenus, getRoleMenus } from
‘@/services/menu’
…
created () {
…
// 加载⻆⾊拥有的菜单列表
this.loadRoleMenus()
},
…
async loadRoleMenus () {
// 请求⻆⾊拥有的菜单列表
const { data } = await getRoleMenus(this.roleId)
if (data.code === ‘000000’) {
console.log(data)
}
},
观察响应数据可以发现,每⼀个菜单项都具有 selected 属性,以此判断是否选中,我们拿到这些数据的id,并设置给 default-checked-keys 即可。
// alloc-menu.vue
ref=“menu-tree”
node-key=“id”
:data=“menus”
:props=“defaultProps”
show-checkbox
:default-expand-all=“true”
:default-checked-keys=“checkedKeys”
>
…
…
data () {
return {
…
// 存储选择的数据 id
checkedKeys: []
}
},
…
async loadRoleMenus () {
// 请求⻆⾊拥有的菜单列表
const { data } = await getRoleMenus(this.roleId)
if (data.code === ‘000000’) {
// 获取选中的数据
this.getCheckedKeys()
}
},
// 数据筛选功能
getCheckedKeys (menus) {
menus.forEach(menu => {
// 检测是否存在⼦数据,如果有,递归查找
// - 同时说明当前节点为‘⽗节点’,不能存⼊,否则勾选会导致⼦选项全选,
设置 return
if (menu.subMenuList) {
return this.getCheckedKeys(menu.subMenuList)
}
// 存储选中数据的 id
if (menu.selected) {
// this.checkedKeys.push(menu.id)
this.checkedKeys = […this.checkedKeys, menu.id]
}
})
}
…