elementUI多级联动el-cascader动态加载数据实现

vue2+elementUI+webpack项目,由于业务需求,需要一个多级联动的省市区的选择搜索项,由此做了一个搜索的通用组件

一开始直接引入elementUI的el-cascader动态加载数据实现

<el-cascader :props="props"></el-cascader>

<script>
  let id = 0;

  export default {
    data() {
      return {
        props: {
          lazy: true,
          lazyLoad (node, resolve) {
            const { level } = node;
            setTimeout(() => {
              const nodes = Array.from({ length: level + 1 })
                .map(item => ({
                  value: ++id,
                  label: `选项${id}`,
                  leaf: level >= 2
                }));
              // 通过调用resolve将子节点数据返回,通知组件数据加载完成
              resolve(nodes);
            }, 1000);
          }
        }
      };
    }
  };
</script>
<template v-else-if="field.type === 10">
              <el-cascader
                clearable
                class="areaCityCascader"
                style="height: 28px; line-height: 28px; width: 220px"
                :props="cascaderProps"
                placeholder="省市区"
                v-model="filter[field.field_value]"
              ></el-cascader>
            </template>

 ====》我的代码实现 js

cascaderProps: {
        lazy: true,
        lazyLoad(node, resolve) {
          const { level, value } = node;
          setTimeout(async () => {
            let nodes = [];
            //接口获取省市区,省的level:1,市的level:2,区的level:3
            let res = await getProjectArea({
              level: level + 1,
              pid: level == 0 ? "" : value
            });
            this.optionCity = res.data;
            nodes = this.optionCity.map(item => ({
              value: item.id,
              label: item.name,
              leaf: level >= 2
            }));
            // 通过调用resolve将子节点数据返回,通知组件数据加载完成
            resolve(nodes);
          });
        }
      },

这样实现后,只能选择完省市区才能实现选中搜索,这个还没有满足业务需求,进一步改造。

目前就实现三级联动,需要更多级联可自行修改。


 cascaderProps: {
        lazy: true,//开启懒加载数据
        checkStrictly: true,//是否严格的遵守父子节点不互相关联,选择任意一级选项数据
        lazyLoad(node, resolve) {
          const { level, value } = node;
          if (level < 3) {
            setTimeout(async () => {
              let nodes = [];
              let res = await getProjectArea({
                level: level + 1,
                pid: level == 0 ? "" : value
              });
              this.optionCity = res.data;
              nodes = this.optionCity.map(item => ({
                value: item.id,
                label: item.name,
                leaf: level >= 2
              }));
              // 通过调用resolve将子节点数据返回,通知组件数据加载完成
              resolve(nodes);
            });
          } else {
            // 目前只有3联级动,所以最后一级联动加载时数据给个空数据。此处不给空数组会造成第三级数据点击时第三级数据后面会一直出现加载数据,影响外观
            resolve([]);
          }
        }
      },

接口封装



 /*通用接口
  三个参数:
   1 apiType: 接口方法 
   2 data:列表或详情传过来对象 
   3 params: 接口所需要额外参数

  */
  async commonInterface(apiType, data, params) {
    let objInterface = {
       //添加默认参数
    };
    let InterfaceParams = Object.assign(objInterface, params);
    let resp = await apiType(InterfaceParams);
    if (parseInt(resp.code) === 200) {
      Message({ type: "success", message: "操作成功!" });
      return resp.data;
    } else {
      return false;
    }
  },

使用:

import {
  patent_handle_revocation,
  get_revocation_node_list,
  order_close_out,
} from "@/ApiV2/Order/patent";

 let interfaceParams = {

      order_status: form.order_status,

      // is_reto: form.is_reto //是否重新走流程: 1 否 2 是

    };

    // 调接口

  await this.patentOtherEnter(patent_handle_revocation, data, interfaceParams)

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
el-cascader是一个基于Element UI的级联选择器组件,支持多选和多级联。要实现多选和多级联数据回显,可以按照以下步骤进行: 1.在模板中使用el-cascader组件,并设置v-model为一个数组,用于存储选中的值。 2.在组件中设置options属性为一个数组,用于存储级联选择器的选项数据。 3.在组件中设置props属性为一个对象,用于自定义选项的属性,例如value用于指定选项的值,label用于指定选项的显示文本。 4.在组件中设置@change事件,用于在选项发生变化时更新选中的值。 5.在组件中设置@expand-change事件,用于在级联选择器展开时动态加载选项数据。 6.在组件中设置cascaderData属性为一个数组,用于存储级联选择器的选项数据。 7.在组件中设置censusLandChange方法,用于在级联选择器展开时动态加载选项数据。 以下是一个el-cascader多选多级联数据回显的示例代码: ```html <template> <el-cascader v-model="selectedOptions" :options="cascaderData" :props="{ value: 'id', label: 'name' }" @change="handleChange" @expand-change="censusLandChange" placeholder="请选择省市区" style="width: 270px; padding-left: 7px;" multiple ></el-cascader> </template> <script> export default { data() { return { selectedOptions: [], cascaderData: [] }; }, mounted() { // 初始化选项数据 this.cascaderData = [ { id: 1, name: "北京市", children: [ { id: 11, name: "东城区", children: [ { id: 111, name: "东华门街道" }, { id: 112, name: "景山街道" } ] }, { id: 12, name: "西城区", children: [ { id: 121, name: "新街口街道" }, { id: 122, name: "西长安街街道" } ] } ] }, { id: 2, name: "上海市", children: [ { id: 21, name: "黄浦区", children: [ { id: 211, name: "外滩街道" }, { id: 212, name: "南京东路街道" } ] }, { id: 22, name: "徐汇区", children: [ { id: 221, name: "徐家汇街道" }, { id: 222, name: "漕河泾街道" } ] } ] } ]; }, methods: { handleChange(value) { // 更新选中的值 this.selectedOptions = value; }, censusLandChange(value, selectedData) { // 动态加载选项数据 const targetOption = selectedData[selectedData.length - 1]; targetOption.loading = true; setTimeout(() => { targetOption.children = [ { id: `${targetOption.id}1`, name: `${targetOption.name}1` }, { id: `${targetOption.id}2`, name: `${targetOption.name}2` } ]; targetOption.loading = false; }, 1000); } } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值