• 使用el-cascader组件子集不能多选


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 weixin_58412143 2024-04-24 15:36 采纳率: 90.8% 浏览 4 首页/ 前端 / 使用el-cascader组件子集不能多选 前端前端框架 下拉选中子集只能选中一个,选中多个后再次回显就会整个父级取消选中,为什么?multiple设置为true允许多选,checkStrictly设置为false则允许选中子选项同时影响父选项 created() { this.getAll() }, getAll(){ getAllList().then((res) => { this.list = translateDataToTree(res) //all菜单转树形结构 // console.log(this.list)//ok }) }, //获取数据 fetchData() { if (this.form.id == undefined) { this.form.id = '' } const params = "id=" + this.form.id getListMenus(params).then((res) => { // this.list = res if (this.title == '添加') { } else { //编辑-选中数据回显 this.defaultCheckedKeys = [] res.forEach(item => { if (item.checked == true) { this.defaultCheckedKeys.push(item) } }) // console.log('再次打开', this.defaultCheckedKeys) this.test(this.defaultCheckedKeys) } }); }, test(val) { // console.log(this.list)//ok console.log('vvv',val) //编辑 let aa = translateDataToTree(val) //选中部分 this.selectedList = this.getIdsFromTree(aa) //二维id数组 // if (this.form.id === 1) { // //超级管理员默认选中全部菜单 // // this.selectedList =this.getIdsFromTree(this.list) // this.selectedList = this.getIdsFromTree(aa) //二维id数组 // console.log(this.selectedList) // } else { // this.selectedList = this.getIdsFromTree(aa) //二维id数组 // } console.log(this.selectedList) }, 展开全部 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    4条回答 默认 最新

    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-24 15:36
      关注

      引自免费微信小程序:皆我百晓生

      根据您提供的代码和描述,看起来您在使用Element UI的el-cascader组件时遇到了一些问题。在尝试回显多选状态时,所有父级节点被取消选择。这可能是因为el-cascader的默认行为是在进行多选时,如果选择了某个子项,则会自动选中其父级节点。而当您从服务器获取数据并试图回显多选状态时,由于选择了多个子项,导致了父级节点的选中状态被重置。

      要解决这个问题,您可以尝试将回显数据的操作调整到watch监听器中,并且对已选中的子节点进行处理,确保它们的父级节点也被选中。以下是修改后的代码示例:

      首先,在您的Vue组件中添加一个watch监听器来观察defaultCheckedKeys的变化:

      
      

      然后在getAll()fetchData()方法中,只更新defaultCheckedKeys,不直接操作selectedList

      methods: {
        ...
        getAll() {
          ...
        },
        fetchData() {
          ...
          this.defaultCheckedKeys = res.filter(item => item.checked === true).map(item => item.id);
          this.test();
        },
        ...
      }
      

      现在,当回显数据时,rebuildSelectedList方法会被调用,它会遍历defaultCheckedKeys中的每个值,找到对应的节点,并递归地将父级节点也加入到selectedList中。这样就可以实现多选子节点的同时保持父级节点的选中状态。

      请注意,这个解决方案依赖于findNodeByKeyaddParentNodes这两个辅助函数,它们用于查找给定ID的节点以及向上遍历并收集父级节点。这些函数假定list数据结构是一个具有id, parent(指向其父节点),children(子节点列表)属性的树形结构。如果实际的数据结构不同,请相应地调整这两个函数。

      展开全部

      评论 编辑记录
      weixin_58412143 2024-04-24 17:03

      可是我写死数据也不回显,跟监听没关系吧? this.selectedList =[[1,6],[2,7,8,9],[3,10]]

      回复
    • 码农阿豪 Java领域优质创作者 2024-04-24 15:36
      关注
      让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
      问题描述:为什么选中下拉菜单中的子选项后,再次回显时会导致整个父级菜单都取消选中? 可能原因:代码中使用了checkStrictly参数并设置为false,这表示选择子项目会影响父项目。而在多选情况下,父项目可能同时有多个子项目被选中,导致在回显时无法正确还原所有子项目的选中状态,最终导致整个父级菜单都取消选中。 解决方案:可以尝试将checkStrictly设置为true,强制只能选择叶子节点,即只能选中子项目而不能选中父项目。这样可以避免多个子项目同时选中同一个父项目的情况发生,进而正确还原选中状态。 示例代码:
      评论
      weixin_58412143 2024-04-24 15:43

      不行,我想要子集全部选中的时候父级也选中,子集选中部分父级有状态的那种效果

      回复
    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-24 15:36
      关注

      下午好🌅🌅🌅
      本答案参考ChatGPT-3.5

      问题描述:

      使用el-cascader组件,子集不能多选。选中子级的选项后,只能选中一个选项,多选后再次回显,父级就会整个取消选中,选中状态不会保存下来。而实际需求是需要多选的,同时能影响到其父选项和子选项。

      问题原因:

      这种情况多半是由于el-cascader组件的多选属性(multiple)设置错误导致的。如果multiple属性没有设置,表明el-cascader组件只能单选;如果设置了multiple属性为true,子选项也能够实现多选,但会导致父选项和子选项的选中状态互相独立,不会相互影响,不能达到需求;如果设置了multiple属性为false,这时需要设置属性checkStrictly为false,这个属性可以允许选中子选项的同时影响父选项,但是不能多选,一次只能选中一个。

      解决方案:

      针对该问题,可以采用以下解决方案:

      1. 设置el-cascader的multiple属性为true。这样,子选项可以多选。

      2. 将el-cascader的checkStrictly属性设置为false。这样,子选项的选中状态会影响其父选项的选中状态。

      3. 配合使用默认选中的值来实现选中状态的保存,可以在选中时把选中的值保存到一个数组中,再将该数组传递给el-cascader组件,这样再次打开时就可以回显之前选中的值。

      正确代码:

      在el-cascader中添加multiple和checkStrictly属性:

      
      

      实现选中状态的保存和回显:

      created() {
        this.getAll();
      },
      methods: {
        // 获取全部数据
        getAll() {
          getAllList().then((res) => {
            this.list = translateDataToTree(res);
          });
        },
        // 获取选中的数据并保存
        fetchSelected() {
          const params = { id: this.form.id || 0 };
          getListMenus(params).then((res) => {
            if (res && res.length > 0) {
              const checkedKeys = [];
              res.forEach(item => {
                if (item.checked === true) {
                  checkedKeys.push(item.id);
                }
              });
              this.selectedList = checkedKeys; // 根据选中子菜单的id设置selectedList的值
            }
          });
        },
      }
      

      以上就是解决该问题的思路和正确代码实现,希望能对你有所帮助。

      展开全部

      评论
      weixin_58412143 2024-04-24 15:47

      我不就是这样写的吗?有问题呀

      回复
    • GISer Liu 2024-04-24 15:50
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      根据你的描述,问题似乎是关于使用 Element UI 的 el-cascader
      组件时出现了子集不能多选的情况,并且选中多个子选项后再次回显时会导致整个父级取消选中的问题。针对这个问题,我会提出一些解决思路和解决方案。

      问题分析:

      1. el-cascader 组件设置问题 :你已经将 multiple 设置为 true,并且 checkStrictly 设置为 false,这应该允许多选并且子选项的选择不会影响到父选项。
      2. 数据处理问题 :从你提供的代码来看,涉及到数据的处理,包括从接口获取数据、转换数据结构等。可能存在数据处理不当导致的问题。
      3. 数据回显问题 :在编辑时,可能存在数据回显时处理不当导致的问题,导致整个父级取消选中。

        解决方案:

        1. 检查数据结构:

        确保从接口获取的数据以及在组件中使用的数据结构是正确的,尤其是父子关系的嵌套结构,以及每个节点是否正确标记了选中状态。

        2. 数据回显处理:

        在编辑时,确保正确设置 v-model,以及在数据回显时遍历设置选中状态的逻辑是否正确。可以尝试使用 Vue DevTools
        等工具检查数据的变化情况。

        3. 调试与排查:

        通过输出日志或者使用调试工具,检查每个步骤中数据的变化情况,尤其是数据在组件中的传递和处理过程中是否发生了意外的变化。

        代码修改建议:

        javascript
        Copy code
        // 在 el-cascader 组件中,确保正确设置 multiple 和 checkStrictly
        "selectedList"
        collapse-tags
        :options="list"
        :props="{ multiple: true, value: 'id', label: 'name', children: 'children', checkStrictly: false }"
        size="medium"
        :style="{ width: '100%' }"
        />
        // 在编辑时,检查数据回显逻辑
        fetchData() {
        if (this.form.id === undefined) {
        this.form.id = '';
        }
        const params = "id=" + this.form.id;
        getListMenus(params).then((res) => {
        if (this.title === '添加') {
        // 添加逻辑
        } else {
        // 编辑时的回显逻辑
        this.defaultCheckedKeys = [];
        res.forEach(item => {
        if (item.checked === true) {
        this.defaultCheckedKeys.push(item);
        }
        });
        // 数据回显后处理选中状态
        this.test(this.defaultCheckedKeys);
        }
        });
        },
        test(val) {
        let aa = translateDataToTree(val); // 将选中的部分转换为树形结构
        this.selectedList = this.getIdsFromTree(aa); // 设置选中的节点
        },
        

        总结:

        以上是我对你描述的问题的分析和解决思路,希望能帮助你解决这个问题。如果需要进一步帮助或者有其他问题,请随时提出。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    聊聊 C# 方法重载的底层玩法
    什么是3322域名?3322域名如何注册?
    EPICS记录参考--模拟输入记录(ai)
    掌动智能浅谈UI自动化测试工具的重要性
    PyTorch深度学习实战 | 预测工资——线性回归
    设计资讯 | 迷你PC:配备 Ryzen 9 芯片组和 7 英寸触摸屏,与 Mac Studio 大小相当
    视频集中存储EasyCVR平台播放一段时间后出现黑屏是什么原因?该如何解决?
    Qt QTableWidget表格的宽度
    Bert基础(二)--多头注意力
    【arm实验2】按键中断事件控制实验
  • 原文地址:https://ask.csdn.net/questions/8094143