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 相关文章推荐
在IE下:float属性会影响offsetTop的取值
Dec 22 Javascript
在模板页面的js使用办法
Apr 01 Javascript
两个listbox实现选项的添加删除和搜索
Mar 01 Javascript
防止xss和sql注入:JS特殊字符过滤正则
Apr 18 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
Aug 23 Javascript
JavaScript hasOwnProperty() 函数实例详解
Aug 04 Javascript
Vue from-validate 表单验证的示例代码
Sep 26 Javascript
详解Vue单元测试case写法
May 24 Javascript
vue路由组件按需加载的几种方法小结
Jul 12 Javascript
创建Vue项目以及引入Iview的方法示例
Dec 03 Javascript
小程序自定义单页面、全局导航栏的实现代码
Mar 15 Javascript
Html5生成验证码的示例代码
May 10 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/02 无线电
PHP生成便于打印的网页
2006/10/09 PHP
mysql5的sql文件导入到mysql4的方法
2008/10/19 PHP
Docker 如何布置PHP开发环境
2016/06/21 PHP
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
js对数字的格式化使用说明
2011/01/12 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
JavaScript实现的Tween算法及缓冲特效实例代码
2015/11/03 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
python k-近邻算法实例分享
2014/06/11 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
Python3.5局部变量与全局变量作用域实例分析
2019/04/30 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
python实现画出e指数函数的图像
2019/11/21 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
python实现一次性封装多条sql语句(begin end)
2020/06/06 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
HTML5 本地存储之如果没有数据库究竟会怎样
2013/04/25 HTML / CSS
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
解释DataSet(ds) 和 ds as DataSet 的含义
2014/07/27 面试题
公务员职业生涯规划书范文  
2014/01/19 职场文书
美术指导求职信
2014/03/17 职场文书
大型公益活动策划方案
2014/08/20 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
个人存款证明书
2014/10/18 职场文书
网络管理员岗位职责
2015/02/12 职场文书
家长高考寄语
2015/02/27 职场文书
七年级语文教学反思
2016/03/03 职场文书
USB TYPE-C 或将成为所有智能手机充电标准
2022/04/21 数码科技