element el-cascader 回显 删除tag bug

路径:

el-cascader回显开启多选,开启tag 导致的删除出现错误
具体配置
开启多选 开启tag 开启可删除 开启只显示末级
错误描述
当我根据后台数据回显后, 点击删除A 其实删除的确实B
解决方法
由于顺序错误的问题导致的, 回显顺序和数据源顺序不一样

分析:

     el-cascader 的tag  是按照index排序的  所以 如果后端返回的数据顺序和你提交的顺序不一致就会出现   tag名称会回显出来  但是点击删除tag是删除的其他tag   通过remove-tag   api 打印发现  当前id并不是当前name 的id    查看源码发现是  排序问题  但是怎么能让后端返回的顺序是你原始数据的顺序呢 ?

  排坑:

   查看官网例子发现数据是从小到大  ok  把后返返回数据排序sort   结果发现还是不对 排查数据

我草  后端数据 子父级id 居然没有关系!导致有些能tag能对应删除  有些不能   他妈的  

既然我自己选择出来的tag 没问题  就说明  选出来的数据是有排序的  所以曲线救国  利用api在后端返回数据时 将选中数据赋值给绑定的值  就解决了排序问题

### Element Plus 中 el-cascader 组件实现功能 在 Element Plus 的 `el-cascader` 组件中,实现功能通常涉及以下几个方面: #### 1. 配置属性 为了支持父子节点不关联的情况并仅返当前节点 ID,可以配置以下参数: - **`checkStrictly`**: 设置为 `true` 表示严格遵循父子节点不互相关联[^3]。 - **`emitPath`**: 设置为 `false` 只返选中的节点值而不是整个路径。 ```html <el-cascader placeholder="请选择" v-model="selectedValue" :options="treeOptions" style="width: 100%" :props="{ checkStrictly: true, value: 'id', label: 'name', children: 'children', emitPath: false }"> </el-cascader> ``` #### 2. 数据准备 确保传入的选项数据 (`options`) 是树形结构,并且每个节点包含必要的字段。例如: ```javascript const treeOptions = [ { id: 1, name: "一级分类", children: [ { id: 2, name: "二级分类A" }, { id: 3, name: "二级分类B" } ] }, { id: 4, name: "另一级分类", children: [] } ]; ``` 如果需要动态加载子节点(懒加载),则需额外定义异步请求函数[^4]。 #### 3. 初始化默认值 通过绑定 `v-model` 属性设置初始选中项。假设服务器返了一个单独的节点 ID 或者完整的路径数组,则可以直接赋值给模型变量。 ```javascript // 假设后端返的是单个ID或者部分路径 let selectedValue = [3]; // 对应于“二级分类B” ``` 当页面首次渲染时,组件会自动匹配此值对应的节点并高亮示它[^1]。 #### 4. 强制刷新视图 (可选) 某些情况下可能发现即使设置了正确的默认值,界面却没有正常更新。此时可通过 Vue 提供的方法手动触发 DOM 更新: ```javascript import { getCurrentInstance } from 'vue'; export default { setup() { const instance = getCurrentInstance(); function forceRefreshView(){ instance.ctx.$forceUpdate(); } return { forceRefreshView }; } } ``` 调用上述自定义方法即可解决此类问题[^2]。 #### 完整示例代码 以下是综合以上要点的一个完整例子: ```html <template> <div> <el-cascader placeholder="请选择类别" v-model="selectedValue" :options="categoryTree" :props="{ checkStrictly: true, value: 'id', label: 'name', children: 'children', emitPath: false }"> </el-cascader> </div> </template> <script> import { defineComponent, reactive, toRefs } from 'vue'; import { getCurrentInstance } from 'vue'; export default defineComponent({ data() { return { categoryTree: [], selectedValue: null }; }, created() { this.fetchCategories().then(() => { this.selectedValue = [this.categoryTree[0].children?.[0]?.id || '']; // 默认选第一个叶子节点作为演示 }); }, methods:{ async fetchCategories(){ try{ const res = await new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve([ {"id":1,"name":"电子产品","children":[ {"id":2,"name":"手机"}, {"id":3,"name":"电脑"} ]} ]); },500); }); this.categoryTree=res; }catch(error){ console.error('获取分类失败:',error); } } } }); </script> ``` ### 注意事项 - 如果使用了懒加载模式(`lazy=true`),记得提供相应的加载调函数来填充子节点数据。 - 当遇到复杂场景比如跨层级跳转选择时,建议仔细调试 props 和事件监听器之间的交互关系[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值