📮 联系我

邮箱: 1373879565@qq.com

element-ui cascader 级联选择器 懒加载回显数据(2025最新解决方法)

网上找了很多方案,都写的云里雾里,搞得很复杂,难倒许多人,还浪费别人时间。

自己研究了下,发现其实非常简单:就是遍历请求已选择的的节点,把数据加到数组就行

其实也很容易理解,既然是懒加载的数据,想要回显的话那肯定要先有数据,把选中的数据加载出来就会根据赋值自动回显。

看代码:

<el-cascader
   :options="addressOptions"
   :props="{
      multiple: true,
      lazy: true,
      lazyLoad: lazyLoadAddress,
    }"
   placeholder="单独选择省市"
   clearable
   v-model="addressValue"
   ref="cascaderRef"
></el-cascader>

 

获取地址列表,初始化第一次请求
    async getAddress() {
      const params = {
        areaLevel: 1,
        areaId: null,
      };
      const res = await getAddress(params);
      if (res.resultCode === 0) {
        this.addressOptions = res.resultData.map((item) => {
          return {
            value: item.areaId,
            label: item.areaName,
            children: [],
          };
        });
      }
    }
 
地址懒加载
async lazyLoadAddress(node, resolve) {
      if (node.level > 1) return resolve([]);
      const params = {
        areaLevel: node.level + 1,
        areaId: node.data.value,
      };
      const res = await getAddress(params);
      if (res.resultCode === 0) {
        const treeData = res.resultData.map((item) => {
          return {
            label: item.areaName,
            value: item.areaId,
            children: [],
            leaf: node.level === 1, // 我这里只有二级,根据你自己的来改动
          };
        });
        resolve(treeData);
      }
    }

 

遍历请求,加载请求回显数据

   async handleLazyDataDisplay() {
      if (!this.addressValue || !this.addressValue.length) {
        return;
      }
      // 确保级联选择器已经挂载
      await this.$nextTick();

      // 对于每个选中的路径,确保其父节点已加载
      this.addressValue.forEach(async (path) => {
        if (path && path.length) {
          // 处理省级节点
          if (path[0]) {
            // 如果需要,可以在这里手动触发省级数据的加载
            const provinceNode = {
              data: {
                value: path[0],
              },
              level: 1,
            };
            // 如果有市级节点,需要加载市级数据
            if (path.length > 1 && path[1]) {
              await new Promise((resolve) => {
                this.lazyLoadAddress(provinceNode, (nodes) => {
                  // 市级数据加载完成后的回调
                  this.addressOptions.find(
                    (item) => item.value == path[0]
                  ).children = nodes;
                });
              });
            }
          }
        }
      });

      // 确保级联选择器更新
      this.$refs.cascaderRef && this.$refs.cascaderRef.$forceUpdate();
    }

请求拿到数据调用

// 请求拿到回显值
function
getData() {
  // 注意,我这里后端定义的格式是省市区使用-拼接,这里重新拆开,你可以根据自己的来
  // 赋值回显值
  this.addressValue = list.map((item) => { return item.areaId.split("-"); });
  // 加载回显值所在列数据
  this.handleLazyDataDisplay(); }

以上就搞定自动回显了

 

 

posted @ 2025-05-20 11:01  打静爵  阅读(553)  评论(0)    收藏  举报