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


Posted in Javascript onMarch 27, 2019

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

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

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

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

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

怎么找了?

当然只能递归了。

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

简化一下大致思路:

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。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一端时间轮换的广告
Jun 26 Javascript
JavaScript中函数(Function)的apply与call理解
Jul 08 Javascript
JavaScript性能优化之小知识总结
Nov 20 Javascript
Angular 封装并发布组件的方法示例
Apr 19 Javascript
浅谈vue后台管理系统权限控制思考与实践
Dec 19 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
Jan 18 Javascript
VuePress 快速踩坑小结
Feb 14 Javascript
详解Vue中组件传值的多重实现方式
Aug 16 Javascript
Vue修改项目启动端口号方法
Nov 07 Javascript
webpack DllPlugin xxx is not defined解决办法
Dec 13 Javascript
vue样式穿透 ::v-deep的具体使用
Jun 04 Javascript
利用js实现简单开关灯代码
Nov 23 Javascript
Node.js 多线程完全指南总结
Mar 27 #Javascript
浅谈JS和jQuery的区别
Mar 27 #jQuery
Nginx设置为Node.js的前端服务器方法总结
Mar 27 #Javascript
Node.js使用supervisor进行开发中调试的方法
Mar 26 #Javascript
详解vue在项目中使用百度地图
Mar 26 #Javascript
jQuery实现动态添加和删除input框实例代码
Mar 26 #jQuery
vue进入页面时滚动条始终在底部代码实例
Mar 26 #Javascript
You might like
Cygwin中安装PHP方法步骤
2015/07/04 PHP
PHP的文件操作与算法实现的面试题示例
2015/08/10 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
javascript 写的一个简单的timer
2009/07/30 Javascript
用js实现的自定义的对话框的实现代码
2010/03/21 Javascript
JQuery拖动表头边框线调整表格列宽效果代码
2014/09/10 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
基于jQuery通过jQuery.form.js插件使用ajax提交form表单
2015/08/17 Javascript
jquery实现清新实用的网页菜单效果
2015/08/28 Javascript
详解javascript的变量与标识符
2016/01/04 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
微信小程序 location API实例详解
2016/10/02 Javascript
jquery实现焦点轮播效果
2017/02/23 Javascript
JavaScript条件判断_动力节点Java学院整理
2017/06/26 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
jQuery添加新内容的四个常用方法分析【append,prepend,after,before】
2019/03/19 jQuery
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
Python的迭代器和生成器使用实例
2015/01/14 Python
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
Python素数检测实例分析
2015/06/15 Python
python删除过期log文件操作实例解析
2018/01/31 Python
pytorch方法测试详解——归一化(BatchNorm2d)
2020/01/15 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
2020/06/12 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
UI自动化定位常用实现方法代码示例
2020/10/27 Python
英国女装网上商店:I Saw It First
2018/10/18 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
电大奖学金获奖感言
2014/08/14 职场文书
忠诚与背叛观后感
2015/06/04 职场文书
毕业生学校组织意见
2015/06/04 职场文书
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
2021/04/06 Python