<template>
<div class="auth_tree">
<el-table
:data="listData"
border
style="width: 100%;">
<el-table-column label="ID" prop="id">
</el-table-column>
<el-table-column label="姓名" prop="name">
</el-table-column>
<el-table-column label="性别" prop="sex">
</el-table-column>
<el-table-column label="权限配置">
<template slot-scope="scope">
<el-button type="primary" size="mini" @click="opetation(scope.row.auth)">配置</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog
:visible.sync="dialogVisible"
title="配置权限"
center
width="600px"
@close="closeDialog">
<div class="dialog_main_content">
<el-tree
ref="tree"
:data="treeData"
:expand-on-click-node="false"
:show-checkbox="true"
node-key="id"
default-expand-all
@check="currentChecked"/>
</div>
<div class="dialog_footer">
<el-button @click="cancel">取 消</el-button>
<el-button type="primary" @click="confirm">确 定</el-button>
</div>
</el-dialog>
</div>
</template>
复制代码
data() {
return {
listData: [
{
id: 1,
name: 'syz',
sex: '男',
auth: [1, 2]
},
{
id: 2,
name: 'lyy',
sex: '女',
auth: [11, 21]
},
{
id: 3,
name: 'yf',
sex: '男',
auth: [211, 212]
},
{
id: 4,
name: 'xkl',
sex: '女',
auth: [211]
},
{
id: 5,
name: 'txl',
sex: '女',
auth: [221]
}
],
dialogVisible: false,
treeData: [
{
id: 1,
label: '一级 1',
children: [
{
id: 11,
label: '二级 1-1'
},
{
id: 12,
label: '二级 1-2'
}
]
},
{
id: 2,
label: '一级 2',
children: [
{
id: 21,
label: '二级 2-1',
children: [
{
id: 211,
label: '三级 2-1-1'
},
{
id: 212,
label: '三级 2-1-2'
}
]
},
{
id: 22,
label: '二级 2-2',
children: [
{
id: 221,
label: '三级 2-2-1'
}
]
}
]
}
]
}
}
复制代码
opetation (auth) {
this.dialogVisible = true
this.$refs.tree.setCheckedKeys(auth)
}
复制代码
这时候将会报如下错误:前端
vue.esm.js?efeb:591 [Vue warn]: Error in event handler for "click": "TypeError: Cannot read property 'setCheckedKeys' of undefined"
相信不少人遇到过这个问题,这是由于this.dialogVisible = true时并无当即更新dom,而是等整个逻辑执行完后再一次新渲染,所以此时的弹框并未渲染,在dom树中是不存在的,
this.$refs.tree is undefined的因此setCheckedKeys确定也是undefined。
解决方法: this.$nextTick(),this.$nextTick()会在dom更新以后在执行回调:
opetation (auth) {
this.dialogVisible = true
this.$nextTick(function() {
this.$refs.tree.setCheckedKeys(auth)
})
}
复制代码
到这里每次打开弹框的时候都会获取最新的角色权限并勾选。vue
currentChecked(data, currentChecked) {
const { checkedNodes, halfCheckedNodes } = currentChecked
console.log(checkedNodes, halfCheckedNodes)
}
复制代码
currentChecked(data, currentChecked) {
let auth = []
const { checkedNodes, halfCheckedNodes } = currentChecked
halfCheckedNodes.length && halfCheckedNodes.forEach(({ id }) => {
auth.push({
id,
type: 2
})
})
checkedNodes.length && checkedNodes.forEach(({ id }) => {
auth.push({
id,
type: 1
})
})
// api 将auth数据保存至后台
}
复制代码
auth: [
{
id: 1,
type:1
}
]
复制代码
opetation (auth) {
this.dialogVisible = true
const arr = []
auth.length &&auth.map(({ id, type }) => {
type === 1 && arr.push(id)
})
this.$nextTick(function() {
this.$refs.tree.setCheckedKeys(arr)
})
}
复制代码
<auth-tree
ref="authTree"
:show-checkbox="true"
:tree-data="tableTreeData"
@currentChecked="currentChecked"/>
复制代码
这时若是咱们使用this.$refs.authTree.setCheckedKeys(auth) 仍然会报错:node
vue.esm.js?efeb:591 [Vue warn]: Error in event handler for "click": "TypeError: Cannot read property 'setCheckedKeys' of undefined"
复制代码
解决办法:在父组件中:element-ui
click() {
this.$refs.authTree.setCheckedKeys(auth)
}
复制代码
在组件中添加setCheckedKeys方法:api
setCheckedKeys(auth) {
this.$refs.tree.setCheckedKeys(auth)
}
复制代码