el-cascader 级联选择器动态加载数据及回显数据方法(最全概括)<grootbaby>

54 篇文章 2 订阅
21 篇文章 0 订阅

当地区数据比较多时,全部获取数据速度太慢,体验不太好,改为懒加载,一级一级选择地区就能很好避免速度慢的问题。首次加载第一级数据,给出所需要的参数,因为首次加载 node.value 没有值,据此判断是不是第一级数据。当点击最后一级的时候 label 后面不会转圈圈,并把相关值赋值到选择器上。编辑弹窗展示的时候,有时候并不能正确回显,取消展示或者改变 key 值。依次类推,拿到全部层级的 code 和 name 传给后端接收使用。获取倒数第二级的数据的 name。获取倒数第三级的数据的 name。

上代码

<el-cascader
  v-if="showCascader"
  class="form-item-cascader"
  :key="resetCascader"
  ref="myCascader"
  v-model="ruleForm.area"
  placeholder="请选择地区"
  :props="optionProps"
  clearable
  @change="handleChange"
></el-cascader>
optionProps: {
  value: 'code',
  label: 'name',
  children: 'areaList',
  emitPath: true,
  lazy: true,
  lazyLoad: (node, resolve)=> {
      const { level, value } = node; // 获取当前node对象中的level, value属性
      this.getArea(level, value, resolve)
  }
},
resetCascader: 0,
// 编辑弹窗回显数据
addAndEdit(row) {
  // 改变 key 值,组件重新渲染,实现数据回显
  this.resetCascader++
  // 组件隐藏,重新渲染,实现数据回显
  // this.showCascader = false
  // setTimeout(() => {
  //   this.showCascader = true
  // }, 1);
  if(row) {
    this.dialogForm = row
    this.dialogForm.area = []
    this.dialogForm.area.push(row.cityCode, row.areaCode, row.streetCode, row.villageCode)
  }
},

getArea(level, value, resolve) {
  let vm = this;
  let url = "/area/v2/find-parent-list";
  const data = {}
  data.parentId = value ? value : 410000000000
  vm.common.getdata(vm, url, data, function(res) {
    const nodes = res.data
    // level == 3 我这里是四级联动,在最后一级不需要下一级,层级从 0 开始
    if (level == 3) {
      nodes.forEach(item => {
        // 当点击最后一级的时候 label 后面不会转圈圈 并把相关值赋值到选择器上
        item.leaf = level >= 1
      })
    }
    resolve(nodes)
  })
},

handleChange(value) {
  if (value && value[0] && value[1] && value[2] && value[3]) {
    this.ruleForm.cityCode = value[0]
    this.ruleForm.areaCode = value[1]
    this.ruleForm.streetCode = value[2]
    this.ruleForm.villageCode = value[3]
    const Nodes = this.$refs.myCascader.getCheckedNodes()[0]
    this.ruleForm.cityName = Nodes.parent.parent.parent.label
    this.ruleForm.areaName = Nodes.parent.parent.label
    this.ruleForm.streetName = Nodes.parent.label
    this.ruleForm.villageName = Nodes.label
  }
},

注意点

1、showCascader resetCascader 都是做编辑回显用的。

编辑弹窗展示的时候,有时候并不能正确回显,取消展示或者改变 key 值重新渲染级联选择器的⽅法都是有效的。

2、optionProps lazy 及 lazyLoad 是设置懒加载的。

当地区数据比较多时,全部获取数据速度太慢,体验不太好,改为懒加载,一级一级选择地区就能很好避免速度慢的问题。

3、data.parentId = value ? value : 410000000000 

首次加载第一级数据,给出所需要的参数,因为首次加载 node.value 没有值,据此判断是不是第一级数据。

4、item.leaf = level >= 1 

当点击最后一级的时候 label 后面不会转圈圈,并把相关值赋值到选择器上。

5、@change="handleChange" 

change 事件获取选中值,但是只能获取到 code 并不能拿到 name 值

this.$refs.myCascader.getCheckedNodes()[0].label 可以获取到最后一级数据的 name 

parent.label 获取倒数第二级的数据的 name 

parent.parent.label 获取倒数第三级的数据的 name 

依次类推,拿到全部层级的 code 和 name 传给后端接收使用。

  • 11
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 28
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 28
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_格鲁特宝宝

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

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

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

打赏作者

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

抵扣说明:

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

余额充值