element Tree 树形控件 父节点默认勾选,子节点的数据全部选中

需求,后台权限控制 , 前端传递给后端勾选中的 节点id , 后端返回树状结构数据.每个对象中有一个字段来标识是否勾选,由于传给后端的时候也需要把父节点的id传递过去.等到下次弹窗打开需要默认勾选中已经绑定过得权限节点,但是遍历后端数据,我把父节点的id 和 按钮权限的 id 都存入到一个数组中,导致组件接收到父级节点的id时,下面的子节点全部勾选.​​​​​

比如就单勾选了 二级 2-1  但是默认显示的时候,存在父节点id ,就会导致父节点下面的元素全部选中.

但是查了好多方法,自己不会用,只能用了最笨的方法 

这个默认勾选的方法

// 获取默认的勾选的 的列表 按钮 id
    /**
     * 1.修改思路, 从接口返回的数据中 获取到 selected为true的下拉菜单,把下拉菜单的id 存到truelist中 
     * 2.然后下拉菜单中 存在 菜单 然后吧selected为true的菜单 也存入到 truelist中
     * 3.然后遍历菜单下的按钮 selected 为 true的 按钮 id 存入到 childrendids中 这个是所有勾选的按钮id
     * 4.如果点击了编辑,但是没有勾选 按钮, 有个标识 ischeck_true 这个是 点击选中框触发时间后状态更改为 true,一旦勾选,truelist中的数据就会改变
     * 会把勾选中的 下拉菜单id 和 菜单id 还有 按钮id 都存入到 truelist这个数组中 ,就直接提交这个数组 ,其他 childrendids 数组提交后默认为空
     * 5.如果没有勾选中,提交的时候判断ischeck_true 时候是 false 就是没有勾选状态,就把 原先默认勾选中的 truelist 和 childrendids 提交
     * 6.如果nav导航栏 有存在 菜单 而不是下拉菜单 的时候 就需要判断 此二级中的children.length === 0 ,就是表示这是菜单,把按钮权限存放到  childrendids中
     */
    gettruelist(data){
      // console.log('data',data);
      for(let i in data){
        //selected === true 就是默认选中
        if(data[i].selected === true)
        {
          this.truelist.push(data[i].id) //添加下拉菜单id
          for(let k in data[i].children){
            console.log('data[i].children[k]',data[i].children[k]);
              //如果第一级是菜单
              if(data[i].children[k].selected === true &&                   data[i].children[k].children.length === 0){
                this.childrenids.push(data[i].children[k].id) //添加菜单id
              }else if(data[i].children[k].selected === true && data[i].children[k].children.length !== 0){
                //如果是第一级是下拉菜单
                console.log('data[i].children[k]',data[i].children[k]);
                this.truelist.push(data[i].children[k].id) //添加菜单id
                for(let l in data[i].children[k].children){
                     //一级按钮
                      if(data[i].children[k].children[l].selected === true && data[i].children[k].children[l].children.length === 0 ){
                          console.log('子节点',data[i].children[k].children[l]);
                          this.childrenids.push(data[i].children[k].children[l].id)
                      }else  if
                      //二级按钮 更多操作
                      ( data[i].children[k].children[l].selected === true && data[i].children[k].children[l].children.length !== 0){
                        this.truelist.push(data[i].children[k].children[l].id)
                        console.log('子节点2',data[i].children[k].children[l]);
                       //循环二级按钮
                       for(let s in data[i].children[k].children[l].children)
                            if(data[i].children[k].children[l].children[s].selected === true){
                                console.log('二级按钮',data[i].children[k].children[l].children[s]);
                                this.childrenids.push(data[i].children[k].children[l].children[s].id)
                              }
                      }
                  }
              }
          }
        }
      }
    },

下拉菜单

菜单

 

然这个是获取到角色的权限数据的时候调用这个方法

//获取该角色的信息
    getrole(data){
      this.$axios.get('地址',{
        params:{
          id:data
        }
      }).then(res=>{
        console.log('res',res);
        let data = res.data.data
        let permissions = data.permissions
        //第一次 没有配置过 data_permission 显示null 就默认个人数据
        if(data.role.data_permission === null){
           this.radio = 1
        }else{
          this.radio = data.role.data_permission.data_permission_type
        }
        //把改用户的列表权限 传过去,然后找到 select 为true 的 保存ID 做默认选择
        this.gettruelist(permissions)
        console.log('childrendids',this.childrenids);
        console.log('truelist',this.truelist);
        this.truelist = [...this.truelist] //这是选中的菜单的id 默认选中时不能添加进去,否则菜单里面的按钮全部选中
        this.childrenids = [...this.childrenids]//这是只显示点击的按钮id
      })
    },

这个是data中定义的变量

//树状结构默认选中的数据
        truelist:[],
        //子节点的默认选中数据
        childrenids:[],
        //树状提交的数据:
        treelist:[],
        //用户点击了勾选  默认false 没勾选 提交的时候需要判断是否勾选
        istree_click:false,

附上点击勾选触发的方法

 //节点选中状态发生变化时的回调
    handleCheckChange(data, checked, indeterminate) {

      //6.25点击了按钮的标识
      this.istree_click = true 

      console.log('data',data);
      console.log('checked',checked);
      console.log('indeterminate',indeterminate);
      let ids = checked.halfCheckedKeys.concat(checked.checkedKeys)
      console.log('ids',ids);
      this.treelist = ids
      console.log('this.treelist',this.treelist);
    },

然后提交的时候需要判断 用户是否点击勾选的操作

//  保存按钮
    submitForm(){
        let data = []
        //需要判断打开弹窗的时候是否点击了选项,如果点击了选项就 提交 treelist 这个是点击了选项重新赋值过后的包括了菜单id和按钮id
        if(this.istree_click === true){
          data = this.treelist
        }else{
          //这是没点击勾选按钮 ,那就把最开始 定义的 菜单id 和 按钮id 合并
          console.log('this.treelist',this.truelist);
          console.log('this.childrenids',this.childrenids);
          this.treelist = this.truelist.concat(this.childrenids)
          data = this.treelist
          console.log('原来的权限',data);
        }

        this.$axios.post('地址',{
           id:this.roleid, //角色id
           data_permission_type :this.radio,//数据权限类型
           permissions:data//权限ID数组
        }).then(res=>{
           this.$message({
            type:'success',
            message:res.data.message
           })
           this.openpower = false //弹窗
           this.treelist = [] // 提交数据
           this.istree_click = false //是否勾选
           this.childrenids = [] //默认按钮id
           this.truelist = [] //默认菜单id
        })
    },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: el-tree 是一个基于 Vue.js 的树形控件,它支持父节点子节点全部勾选子节点父节点自动勾选等功能。在实现上,可以使用 v-model 指令绑定数据,并使用 @check-change 事件监听勾选状态的变化,从而实现父子节点之间的级联勾选。 在子节点只要有一个不勾选父节点就是不勾选状态的实现上,可以在 @check-change 事件遍历子节点勾选状态,如果有一个子节点没有被勾选,就取消父节点勾选状态。 ### 回答2: el-treeElement UI 的一种树形组件,用于展示具有层级关系的数据。根据问题描述,我们可以使用该组件实现勾选父节点子节点全部勾选勾选全部子节点父节点自动勾选的功能,以及根据子节点勾选状态来确定父节点勾选状态。 首先,对于勾选父节点子节点全部勾选的功能,我们可以通过监听勾选事件,当勾选父节点时,遍历该父节点的所有子节点,并将所有子节点设置为勾选状态。代码示例如下: ```vue <template> <el-tree :data="data" @node-click="handleNodeClick"> </el-tree> </template> <script> export default { data() { return { data: [{ label: '父节点', children: [{ label: '子节点1' }, { label: '子节点2' }] }] }; }, methods: { handleNodeClick(data) { if (data.children) { // 点击父节点时,遍历子节点并设置为勾选状态 data.children.forEach(child => { this.$refs.tree.getNode(child).setChecked(true); }); } } } }; </script> ``` 其次,对于勾选全部子节点父节点自动勾选的功能,我们可以通过监听勾选事件,在勾选或取消勾选子节点时,根据子节点勾选状态来设置父节点勾选状态。代码示例如下: ```vue <template> <el-tree :data="data" show-checkbox @check="handleCheck"> </el-tree> </template> <script> export default { data() { return { data: [{ label: '父节点', children: [{ label: '子节点1', checked: true }, { label: '子节点2', checked: true }] }] }; }, methods: { handleCheck(data) { const node = this.$refs.tree.getNode(data); if (node.parent && !node.checked) { // 如果子节点取消勾选,则取消父节点勾选 node.parent.setChecked(false); } } } }; </script> ``` 综上所述,以上的代码可以实现勾选父节点子节点全部勾选勾选全部子节点父节点自动勾选的功能,子节点只要有一个不勾选父节点就是不勾选状态。 ### 回答3: el-treeElement UI 提供的树形组件,具有复选框的功能。根据题目要求,实现以下勾选规则: 1. 当点击父节点时,如果该父节点子节点全部勾选,那么父节点自动勾选;如果有任何一个子节点没有勾选,则父节点勾选。 2. 当点击子节点时,如果该子节点父节点的最后一个未勾选子节点,那么勾选子节点会将父节点勾选;反之,只有勾选父节点后,子节点才会自动勾选。 为了实现该功能,我们可以使用 Element UI 提供的 tree-props 属性的 "emit-checked" 和 "check-strictly": 1. 要使得父节点子节点全部勾选时自动勾选,我们可以设置 tree-props 属性的 "emit-checked" 为 true。 2. 要使得子节点只要有一个不勾选父节点就是不勾选状态,我们可以设置 tree-props 属性的 "check-strictly" 为 true。 具体实现: ``` <template> <el-tree :data="treeData" :props="treeProps" node-key="id" ></el-tree> </template> <script> export default { data() { return { treeData: [ { id: 1, label: "父节点1", children: [ { id: 11, label: "子节点1-1" }, { id: 12, label: "子节点1-2" }, { id: 13, label: "子节点1-3" }, ], }, { id: 2, label: "父节点2", children: [ { id: 21, label: "子节点2-1" }, { id: 22, label: "子节点2-2" }, { id: 23, label: "子节点2-3" }, ], }, ], treeProps: { emitChecked: true, checkStrictly: true, }, }; }, }; </script> ``` 上述代码,我们使用了一个简单的树形结构作为示例。在实际使用,你可以根据自己的需求进行相应的数据处理和页面渲染。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值