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 相关文章推荐
javascript 事件查询综合 推荐收藏
Mar 10 Javascript
SeaJS 与 RequireJS 的差异对比
Dec 08 Javascript
JavaScript中的substr()方法使用详解
Jun 06 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
Sep 04 Javascript
js判断日期时间有效性的方法
Oct 24 Javascript
深入理解jQuery事件绑定
Jun 02 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
Jun 02 Javascript
JavaScript事件发布/订阅模式原理与用法分析
Aug 21 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
Apr 14 Javascript
彻底揭秘keep-alive原理(小结)
May 05 Javascript
基于JavaScript伪随机正态分布代码实例
Nov 07 Javascript
从原生JavaScript到React深入理解
Jul 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
php Hex RGB颜色值互换的使用
2013/05/10 PHP
提高PHP编程效率的方法
2013/11/07 PHP
字符串长度函数strlen和mb_strlen的区别示例介绍
2014/09/09 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
js调用后台、后台调用前台等方法总结
2014/04/17 Javascript
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
概述BootStrap中role=&quot;form&quot;及role作用角色
2016/12/08 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
JavaScript循环_动力节点Java学院整理
2017/06/28 Javascript
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
Vue使用zTree插件封装树组件操作示例
2019/04/25 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
Elasticsearch实现复合查询高亮结果功能
2019/09/10 Javascript
JS获取当前时间的年月日时分秒及时间的格式化的方法
2019/12/18 Javascript
python中子类继承父类的__init__方法实例
2016/12/15 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
python爬虫实现教程转换成 PDF 电子书
2017/02/19 Python
Python 实现购物商城,含有用户入口和商家入口的示例
2017/09/15 Python
python素数筛选法浅析
2018/03/19 Python
python矩阵转换为一维数组的实例
2018/06/05 Python
Python代码覆盖率统计工具coverage.py用法详解
2020/11/25 Python
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
2013/01/31 HTML / CSS
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
俄罗斯金苹果网上化妆品和香水商店:Goldapple
2019/12/01 全球购物
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
酒店节能降耗方案
2014/05/08 职场文书
工作所在部门证明
2014/09/21 职场文书
2015毕业寄语大全
2015/02/26 职场文书
不同意离婚答辩状
2015/05/22 职场文书
《卧薪尝胆》读后感3篇
2019/12/26 职场文书
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers