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 相关文章推荐
通过ifame指向的页面高度调整iframe的高度
Oct 05 Javascript
扩展JavaScript功能的正确方法(译文)
Apr 12 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
Jun 10 Javascript
有效提高JavaScript执行效率的几点知识
Jan 31 Javascript
JS+CSS实现的经典tab选项卡效果代码
Sep 16 Javascript
简单实现限制uploadify上传个数
Nov 16 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
Nov 18 Javascript
vue多种弹框的弹出形式的示例代码
Sep 18 Javascript
详解微信UnionID作用
May 15 Javascript
webpack.DefinePlugin与cross-env区别详解
Feb 23 Javascript
React实现类似淘宝tab居中切换效果的示例代码
Jun 02 Javascript
vue-quill-editor的使用及个性化定制操作
Aug 04 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
收音机指标测试方法及仪器
2021/03/01 无线电
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
Ajax+PHP 边学边练之四 表单
2009/11/27 PHP
destoon会员注册提示“数据校验失败(2)”解决方法
2014/06/21 PHP
php禁止直接从浏览器输入地址访问.php文件的方法
2014/11/04 PHP
PHP速成大法
2015/01/30 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
详解json在php中的应用
2018/09/30 PHP
js和jquery批量绑定事件传参数一(新猪猪原创)
2010/06/23 Javascript
jQuery源码分析-04 选择器-Sizzle-工作原理分析
2011/11/14 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
JS打开新窗口防止被浏览器阻止的方法
2015/01/03 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
详解nodejs爬虫程序解决gbk等中文编码问题
2017/04/06 NodeJs
使用Xcache缓存器加速PHP网站的配置方法
2017/04/22 Javascript
基于bootstrap页面渲染的问题解决方法
2018/08/09 Javascript
webpack打包多页面的方法
2018/11/30 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
python中将字典转换成其json字符串
2014/07/16 Python
python使用socket向客户端发送数据的方法
2015/04/29 Python
python中的colorlog库使用详解
2019/07/05 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
详解PyTorch手写数字识别(MNIST数据集)
2019/08/16 Python
美国知名女性服饰品牌:New York & Company
2017/03/23 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
建筑工程实习自我鉴定
2013/09/19 职场文书
普通大学毕业生自荐信
2013/11/04 职场文书
运动会邀请函范文
2014/02/06 职场文书
开学季活动策划方案
2014/02/28 职场文书
高中学生期末评语
2014/04/25 职场文书
Vue监视数据的原理详解
2022/02/24 Vue.js
MySQL 条件查询的常用操作
2022/04/28 MySQL