<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)
}
複製代碼