element el-cascader动态加载数据 (多级联动,落地方案)

前言

最近需要用到element ui的这个插件做地区的四级联动,但是碰了一些问题:

  • 官网的说明太泛泛然,不易看懂
  • 网上的教程乱七八糟,代码一堆一堆的
  • 看这篇就对了!!!
  • 效果图 => 

  • 点击确认后的值 

1. template

   <el-cascader
      size="mini"
      :props="props"
      @change="handleChange"
      v-model="value"
      style="width: 300px"
    ></el-cascader>
    

//  props => 控制动态加载的配置

// @change => 监听变化

// value => 值

2. methods()

    // 获取省市区街道
    provinceFn(id) {
      let data = {
        up_id: id,
      };
      // 此处是一个promise 直接返回
      return postRequest(url.getlowerlevelarea, data);
    },
    // 监听数据变化
    handleChange(value) {
      console.log(value);
    }

3. data()配置

  data() {
    return {
      value: [],    // 多级联动的值 => 会是一个数组
      props: {
        lazy: true,
        lazyLoad: (node, resolve) => {
          // node 节点数据 node.value => 当前节点的值
          // level: 层级 => 1,2,3,4
          const { level } = node;
          // 动态节点
          const nodes = [];          
          // 为1代表第一次请求
          let type = level == 0 ? "1" : node.value;
          this.provinceFn(type)
            .then((res) => {
              if (res.code == -1) {
                this.msgFn("error", res.message);
                return;
              }
              // 节点数组
              res.data.map((item) => {
                // obj里的键值是官方要求的
                let obj = {
                  value: item.city_id,
                  label: item.city_name,
                  leaf: node.level >= 3, 
                };
                nodes.push(obj);
              });
              // resolve 节点返回
              resolve(nodes);
            })
            .catch((error) => {
              console.log(error);
            });
        },
      },
    };
  }

FAQ

注释其实已经非常详细了,整体思路是这样的:

  1. 根据官方文档,首先得知道 lazyLoad方法中的参数node, resolve分别是什么
  2. 配置自己的接口请求,我的是地区数据(省市区四级联动)
  3. 需要注意的是 props需要在data()里赋值,所以数据请求也要放进去
  4. 获取到数据后,需要按照它的规范赋值 => value:值,label:文字,leaf:层级
  5. 如果是三级,那么leaf值是=> 0, 1, 2,以此类推。我的是四级,所以是 => node.level >= 3
  6. 尽量不要用hover(效果会一闪一闪的,用户体验不好,click最佳)

已封装成组件,附上全部代码,供君使用:

<template>
  <div class="con">
    <el-cascader
      size="mini"
      :props="props"
      @change="handleChange"
      v-model="value"
      style="width: 300px"
    ></el-cascader>
  </div>
</template>
<script>
import url from "../request/url.js";
import { postRequest } from "../request/api.js";
export default {
  name: "newRegion",
  data() {
    return {
      value: [],
      props: {
        lazy: true,
        lazyLoad: (node, resolve) => {
          const { level } = node;
          const nodes = [];
          // level: 层级
          // node 节点数据
          // 一级菜单数据
        
          // 为1代表第一次请求
          let type = level == 0 ? "1" : node.value;
          this.provinceFn(type)
            .then((res) => {
              if (res.code == -1) {
                this.msgFn("error", res.message);
                return;
              }
              // 节点数组
              res.data.map((item) => {
                // {value:'',label:'全部'}
                let obj = {
                  value: item.city_id,
                  label: item.city_name,
                  leaf: node.level >= 3, 
                };
                nodes.push(obj);
              });
              // resolve 节点返回
              resolve(nodes);
            })
            .catch((error) => {
              console.log(error);
            });
        },
      },
    };
  },
  created() {},
  methods: {
    // 获取省市区
    provinceFn(id) {
      let data = {
        up_id: id,
      };
      return postRequest(url.getlowerlevelarea, data);
    },
    handleChange(value) {
      console.log(value);
    },
    // 弹窗
    msgFn(type, text) {
      this.$message({
        message: text,
        type: type,
      });
    },
  },
};
</script>
<style lang="scss" scoped>
.con {
  display: inline-block;
}
</style>

 良心好文,讲的非常细致了,真心求顶~,以后会持续输出高质量好文!

 

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: &#39;id&#39;, label: &#39;name&#39; }" @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> ```
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

欧阳呀

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值