首页 > 编程 > JavaScript > 正文

Element中的Cascader(级联列表)动态加载省/市/区数据的方法

2019-11-19 11:56:29
字体:
来源:转载
供稿:网友

element中的cascader其实是有动态加载次级选项的方法。

方法的原理是利用址(引用)传递,动态修改:options

var c={name: 'bob'}var d=cd.name = 'tom'console.log(c)// {name: "tom"}

http://element-cn.eleme.io/#/zh-CN/component/cascader#dong-tai-jia-zai-ci-ji-xuan-xiang

其中找到究竟需要在那层添加数据就变成一个很麻烦的问题。

怎么找了?

当然只能递归了。

简化一下大致思路:

var a = [ {  value: '2',  children: [   {    value: '2-1',    children: [     {      value: '2-1-1',      children: [],     },    ],   },   {    value: '2-2',    children: [     {      value: '2-2-1',      children: [],     },     {      value: '2-2-2',      children: [       {        value: '2-2-2-1',        children: [],       },      ],     },    ],   },  ], },]var b = ['2','2-2','2-2-1']

那么我们就需要通过b找到a所在的位置。

a[0].children[1].children[0]{  value: '2-2-1',  children: [], },

然后再赋值:

a[0].children[1].children[0].children = [{value: '2-2-1-1',children: []}]console.log(a)

编写function:

findRegionOption(regionOptions, regionArr) {   if (_.isEmpty(regionArr) || _.isEmpty(regionOptions)) {    return null   }   let regionId = _.first(regionArr)   let regionOption = _.find(regionOptions, regionOption => {    return regionOption.value === regionId   })      if (!regionOption) {    return null   }      let tailRegionArr = _.tail(regionArr) // lodash的tail方法,获取除了array数组第一个元素以外的全部元素。   if (_.isEmpty(tailRegionArr)) {    return regionOption   }   return this.findRegionOption(regionOption.children, tailRegionArr)}

动态加载数据:

loadRegionChild(regionIdArr) { let regionOptions = this.regionHiera let regionOptionInUI = this.findRegionOption(regionOptions, regionIdArr) if (  !regionOptionInUI ||  !regionOptionInUI.children ||  regionOptionInUI.children.length > 0 ) {  return null } let regionKey = _.last(regionIdArr) if (!regionKey) {  return null } api  .getRegionHiera(regionKey)  .then(res => {   let regionHiera = res.data   regionOptionInUI.children = regionChildrenTransfomed // 动态加载赋值  })}

整个页面代码大致就是:

<template> <div>   <el-cascader :options="regionHiera" v-model="selectedRegion" change-on-select/> </div></template><script>export default { name: 'Test', data() {  return {   selectedRegion: [],   regionHiera: [    { label: 'Malaysia', value: '136', children: [] },    { label: 'Indonesia', value: '106', children: [] },    { label: '中华人民共和国', value: '100000', children: [] },    { label: 'United States', value: '244', children: [] },   ],  } }, watch: {  selectedRegion(nv) {   this.loadRegionChild(nv)  }, },  methods: {   findRegionOption(regionOptions, regionArr) {   if (_.isEmpty(regionArr) || _.isEmpty(regionOptions)) {    return null   }   let regionId = _.first(regionArr)   let regionOption = _.find(regionOptions, regionOption => {    return regionOption.value === regionId   })   if (!regionOption) {    return null   }   let tailRegionArr = _.tail(regionArr)   if (_.isEmpty(tailRegionArr)) {    return regionOption   }   return this.findRegionOption(regionOption.children, tailRegionArr)  },  loadRegionChild(regionIdArr) {   let regionOptions = this.regionHiera   let regionOptionInUI = this.findRegionOption(regionOptions, regionIdArr)   if (    !regionOptionInUI ||    !regionOptionInUI.children ||    regionOptionInUI.children.length > 0   ) {    return null   }   let regionKey = _.last(regionIdArr)   if (!regionKey) {    return null   }   api    .getRegionHiera(regionKey)    .then(res => {     let regionHiera = res.data //后台返回数据     regionOptionInUI.children = regionChildrenTransfomed    })  },  }}</script>

整体思路还是找到点击后的region,然后动态赋值给children。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表