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 相关文章推荐
JS 有名函数表达式全面解析
Mar 19 Javascript
入门基础学习 ExtJS笔记(一)
Nov 11 Javascript
javascript实现简单的Map示例介绍
Dec 23 Javascript
使用jQuery实现input数值增量和减量的方法
Jan 24 Javascript
jQuery解决input超多的表单提交
Aug 10 Javascript
JavaScript数组的定义及数字操作技巧
Jun 06 Javascript
angular使用post、get向后台传参的问题实例
May 27 Javascript
jQuery实现用户信息表格的添加和删除功能
Sep 12 jQuery
angular6.0使用教程之父组件通过url传递id给子组件的方法
Jun 30 Javascript
layui-laydate时间日历控件使用方法详解
Nov 15 Javascript
vue data恢复初始化数据的实现方法
Oct 31 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
May 15 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
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
php之XML转数组函数的详解
2013/06/07 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
变量声明时命名与变量作为对象属性时命名的区别解析
2013/12/06 Javascript
json的定义、标准格式及json字符串检验
2014/05/11 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
JavaScript判断浏览器运行环境的详细方法
2019/06/30 Javascript
微信小程序实现吸顶效果
2020/01/08 Javascript
[02:12]打造更好的电竞完美世界:完美盛典回顾篇
2018/12/19 DOTA
python网络编程学习笔记(四):域名系统
2014/06/09 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
2019/07/15 Python
详解python pandas 分组统计的方法
2019/07/30 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
2019/08/28 Python
一款纯css3实现的竖形二级导航的实例教程
2014/12/11 HTML / CSS
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
大专学生推荐信范文
2013/11/19 职场文书
广告设计应届生求职信
2014/03/01 职场文书
赔偿协议书
2015/01/27 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python