el-cascader三级联动懒加载回显问题

        李奶奶的,困扰了我两个周的问题终于在今天得到了解决。神坑~~

        如果你有幸刷到这篇文章,恭喜你,困扰你的问题总算有解决方法了。本篇文章解决你所有级联懒加载回显的问题和修改样式不生效问题。

问题描述:

        我的需求是调了三个下拉框接口进行关联。在form表单里进行选择传值都是没问题的。刚开始数据少没有出现问题。第二天数据多了测试提了个bug,三级联动竟然不显示数据了。

 

         然后就是两个周的探索,夜不能寐啊。两个周啊!!

        网上给的方法各式各样。甚至有说回显必须有options,使用递归把options的数据填好进行回显。纯属扯淡。

附上代码

html:

        <el-cascader
          v-model="data.eventComboBoxValue"
          :props="cascaderProps"
          clearable
        />

js:

 cascaderProps() {
      return {
        lazy: true,
        lazyLoad: this.lazyLoad
      };
    }

methods:{
 async lazyLoad(node, resolve) {
      let level = node.level;
      let result;
      switch (level) {
        case 0: // 类型
          let initRes = await eventList();
          result = initRes.data.pageResult.list;
          break;
        case 1: //一级目录
          let firstParams = {
            upstreamId: node.data.value
          };
          let firstRes = await eventList(firstParams);
          result = firstRes.data.pageResult.list;
          break;
        case 2: // 二级目录
          let secondParams = {
            eventTypeId: node.data.value
          };
          let secondRes = await eventList(secondParams);
          result = secondRes.data.pageResult.list;
          result.forEach(item => {
            item.leaf = level >= 2;
          });
          break;
        default:
          result = [];
          break;
      }
      resolve(result);
    },
}

        这样是一般写法,很多小伙伴这样写也不会有问题,但是看下请求数据的列表。某一个列表重复请求了多次。解决方法是在请求前加一层判断,已经有数据了就不要重复请求了。

     if (node.children && node.children.length > 0) return;

        到了这一步还是没有回显。仔细看你的数据是不是有重复项?比如第一层和第二层id一样?恭喜你,遇到了和我一样的问题。出现问题的原因是。cascader的每一项id都不能重复,否则就不会进行下一层的加载了。和后端商量了几种解决方案。给出最完美的方案。

        请求列表的时候多传一个自定义字段,我传的是fromLinkage:1,让后端知道我是在调级联列表,这么做是为了不影响其他模块下拉列表的功能。

 然后后端返回一个唯一标识避免重复,我们采用的是拼接列表名称。

第一层返回

 第二层返回

第三层返回 

        把返回的这一项作为你的value值,这样每一层的value都是唯一了。完美解决问题。正常回显。

至此有用过级联el-cascader的伙伴都能解决问题了。那么点赞出门左转,可以摸鱼啦~~

以下内容偏傻瓜式教学,供尚不能解决问题的新人参考。

        综上所述,我点击第二层的时候传参应该传id:3,但是现在传了id:'upstreamid3',因为你原来的value值已经绑定成了后端返回的key。value是从node中拿出来的,那我能不能拿到之前的3传给后端呢?当然可以。

 只需在你rosolve的数组里添加一个自定义字段,下一轮你就能从node中拿到你存的flag了!

第二层、第三层请求传给后端。

        总结:一般这种回显会出现在编辑、查看弹窗或者路由跳转中,如果你的代码还有问题不能回显。弹窗或者新的页面中中加个v-if每次关闭销毁,获取到详情再创建即可。

        如果解决了你的问题请点赞!点赞!让我看看有多少被这个问题折磨的铁子们~~~

        另外新版本的element级联会有一页数据太多展示不下的问题,修改样式竟然没生效,我们会使用的是less,less穿透使用/deep/,scss穿透使用::v-deep。都不生效。

        最终解决方案是把scope去掉,成功解决~

 点赞收藏加关注,前端探讨不迷路~~

前端之家企鹅群:610408494

 

### 实现 Element UI `el-cascader` 组件三级联动赋值与 为了实现 `el-cascader` 的三级联动并确保其能够正确地进行初始值设置以及后续的数据,可以遵循以下方法: #### 1. 安装必要的依赖包 安装用于提供中国地区数据的插件: ```bash npm install element-china-area-data -S ``` #### 2. 引入区域数据模块 在项目中的 JavaScript 文件内引入所需的区域数据及相关工具函数: ```javascript import { regionData, CodeToText, TextToCode } from 'element-china-area-data'; ``` #### 3. 配置级联选择器选项 定义好级联选择器所需的基础配置项,包括但不限于指定 `options` 属性来绑定之前导入的 `regionData`。 #### 4. 编写模板代码 HTML 结构如下所示,注意这里设置了 `v-model` 来双向绑定选中值,并通过监听 `@change` 事件处理变化逻辑[^2]。 ```html <template> <div> <!-- 级联选择器 --> <el-cascader class="select" size="large" :options="options" v-model="selectedOptions" @change="handleChange"> </el-cascader> <!-- 表单控件 (可选) --> <el-col :span="12"> <el-form-item prop="region"> <el-cascader v-model="form.region" :props="cascProps" placeholder="省/市/县" :options="RegionArr" clearable :disabled="isDisab"/> </el-form-item> </el-col> </div> </template> <script> export default { data() { return { options: regionData, selectedOptions: [], // 初始为空数组表示未选择任何内容 form: { region: [] // 同样初始化为一个空数组 }, RegionArr: regionData, isDisab: false, cascProps: { value: 'value', label: 'label', checkStrictly: true // 关键属性:允许单独选择某一级而不必选择完整的路径 } }; }, methods: { handleChange(value) { console.log('当前选中的值:', value); } } }; </script> ``` 上述代码片段展示了如何利用 Vue.jsElement UI 创建一个多级地址选择框,并且支持默认值设定和更改后的调操作。特别需要注意的是,在某些情况下可能需要调整 `checkStrictly` 参数以便更好地控制用户交互行为[^3]。 当页面加载完成之后,如果想要让某个特定地区的组合自动被选定,则可以通过给 `selectedOptions` 或者 `form.region` 赋予相应的编码序列来达到目的;而要实现在提交表单后再次展示上次的选择结果(即所谓的“”),则需保证服务器端返的数据格式匹配前端预期的形式——通常是一个由各级行政区划代号构成的一维列表[^4]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuwenjie_

感谢打赏,问题留言~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值