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 相关文章推荐
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
Mar 28 Javascript
深入分析js的冒泡事件
Dec 05 Javascript
jQuery中addClass()方法用法实例
Jan 05 Javascript
jQuery获取DOM节点实例分析(2种方式)
Dec 15 Javascript
使用JSON作为函数的参数的优缺点
Oct 27 Javascript
微信小程序开发一键登录 获取session_key和openid实例
Nov 23 Javascript
jQuery实现标签页效果实战(4)
Feb 08 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
Apr 18 Javascript
浅谈Vue父子组件和非父子组件传值问题
Aug 22 Javascript
jQuery简单实现对数组去重及排序操作实例
Oct 31 jQuery
详解vue2.6插槽更新v-slot用法总结
Mar 09 Javascript
webpack4从0搭建组件库的实现
Nov 29 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实现最简单的MVC框架实例教程
2014/09/08 PHP
PHP合并discuz用户脚本的方法
2015/08/04 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
js实现翻页后保持checkbox选中状态的实现方法
2012/11/03 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
PHPExcel中的一些常用方法汇总
2015/01/23 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
JavaScript Length 属性的总结
2015/11/02 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
详解在Vue中有条件地使用CSS类
2017/09/30 Javascript
Vue实现一个无限加载列表功能
2018/11/13 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
浅谈flask源码之请求过程
2018/07/26 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
详解python运行三种方式
2019/05/13 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
Python高级property属性用法实例分析
2019/11/19 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
Node.js 和 Python之间该选择哪个?
2020/08/05 Python
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
国家地理在线商店:Shop National Geographic
2018/06/30 全球购物
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
节能减排倡议书
2014/04/15 职场文书
项目合作协议书范本
2014/04/16 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
安全承诺书格式
2014/05/21 职场文书
2014年工程工作总结
2014/11/25 职场文书
小学中等生评语
2014/12/29 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
使用vue-element-admin框架从后端动态获取菜单功能的实现
2021/04/29 Vue.js