el-tree(权限 多选框保存)

分配权限

6.1 调用接口,弹出对话框

6.2 添加tree

  <el-tree :data="rightsList" :props="defaultProps"></el-tree>
 
rightsList: [],
            defaultProps: {
                children: 'children',
                label: 'authName'
 
            },

6.3 添加复选框

 

show-checkbox

6.4选中的时候,希望选中的是id值

6.5 所有节点, 默认都展开

default-expand-all="true"

 

6.6 已有的权限,默认勾选上

:default-checked-keys="defKeys"

项目使用:

 

1获取所有的权限列表

2 获取角色下的权限列表(递归获取角色下所有的三级节点)

将角色下的权限id 都存在 defKey数组即可

就可以得到

注意:

<code class="language-plaintext hljs">    // 展示分配权限的对话框
    async showSetRightDialog(roles) {
      this.rolesId = roles.id
      // 获取所有权限列表
      const { data: res } = await this.$http.get('rights/tree')
      if (res.meta.status !== 200) {
        return this.$message.error('获取权限列表失败!')
      }
      // 获取到的权限数据保存
      this.rightsList = res.data
      console.log(this.rightsList)
      // 递归获取三级节点
      this.getLeafKeys(roles, this.defKeys)
      this.SetRightDialogVisible = true
    },
    

   // 递归的形式,获取角色下所有的三级权限的id,并保存到 defKeys数组中
    getLeafKeys(node, arr) {
      // 如果当前node没有children属性则是三级节点
      if (!node.children) {
        return arr.push(node.id)
      }
      node.children.forEach(item => this.getLeafKeys(item, arr))
    },</code>

6.7 bug

当你点击多个角色的分配权限,你发现后边 角色的已有权限不对了, 多了很多

因为关闭分配角色的时候没有清除权限,长此以往导致权限越来越多

解决:

每次关闭【分配权限】 的时候清空数组

@close="SetRightDialogVisibleClosed"
 
// 监听分配权限对话框的关闭事件
    SetRightDialogVisibleClosed() {
      // 清空 defkeys 数组  避免累积
      this.defKeys = []
    },

6.8 点确定,进行角色授权

获取所以已选中的id 和半选中的ID ,【合并数组】,将【数组】转成【字符串】 ,传送到服务器

怎么获取所以已选中的id (以前有的ID)和半选中的ID (自己添加的id

 

    async allotRights() {
      const keys = [...this.$refs.treeRef.getCheckedKeys(), ...this.$refs.treeRef.getHalfCheckedKeys()]
      const idStr = keys.join(',')
      const { data: res } = await this.$http.post(`roles/${this.rolesId}/rights`, { rids: idStr })
      if (res.meta.status !== 200) {
        return this.$message.error('分配权限失败!')
      }
      this.$message.success('分配权限成功!')
      this.getRolesList()
      this.SetRightDialogVisible = false
    }

注意: getCheckedKeys,getHalfCheckedKeys 不要写成getHalfCheckedNodes

2 获取成功之后,如果没有清除defKeys,回造成累加,你看的现象是 没有起作用 。记得关闭弹窗,清空数组

3 弹框点确定,拿不到roleId, 需要我们点分配角色的时候,将roleId存起来先

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Vue2中,可以使用element-ui的el-tree组件实现多选框。通过设置show-checkbox属性为true,可以在每个节点前添加一个复选框。然后可以使用check-change事件来监听勾选状态的改变,并通过refs获取勾选的节点数据。 在给el-tree绑定的check-change事件中,可以通过this.$refs.tree.getCheckedKeys()来获取目前被选中的节点的key所组成的数组,通过this.$refs.tree.getCheckedNodes()来获取目前被选中的节点所组成的数组。根据获取的勾选节点数量与treeData的数量进行比较,可以判断是全选、反选还是半选。通过设置v-model来控制全选或反选的状态。 示例代码如下: ```html <template> <el-checkbox v-model="checkecd" :indeterminate="indeterminate" @change="checkedAll">全部</el-checkbox> <el-tree :props="props" :data="treeData" ref="tree" accordion show-checkbox node-key="id" :expand-on-click-node="false" @check-change="handleCheckChange"></el-tree> </template> <script> export default { data() { return { checkecd: false, // 是否全选 indeterminate: false, // 是否半选 treeData: [], // 树的数据 props: { // 树节点的属性配置 } }; }, methods: { handleCheckChange(item, isChecked) { // 获取勾选的数据 let checkNode = this.$refs.tree.getCheckedKeys(); // 目前被选中的节点的 key 所组成的数组 let checkNodeName = this.$refs.tree.getCheckedNodes(); // 返回目前被选中的节点所组成的数组 // 如果勾选数量等于拉平后的treeData的数量,则是全选,反之为反选 if (checkNode.length === this.treeData.length) { this.checkecd = true; this.indeterminate = false; } else if (checkNode.length === 0) { this.checkecd = false; this.indeterminate = false; } else { this.indeterminate = true; } }, checkedAll(isChecked) { // 全选/反选 if (isChecked) { this.$refs.tree.setCheckedNodes(this.treeData); } else { this.$refs.tree.setCheckedNodes([]); } } } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值