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 miscellanea -display data real time, using window.status
Jan 09 Javascript
科讯商业版中用到的ajax空间与分页函数
Sep 02 Javascript
Kibo 用于处理键盘事件的Javascript工具库
Oct 28 Javascript
用按钮控制iframe显示的网页实现方法
Feb 04 Javascript
JS 实现Table相同行的单元格自动合并示例代码
Aug 27 Javascript
jquery获取复选框被选中的值
Mar 22 Javascript
JavaScript两种跨域技术全面介绍
Apr 16 Javascript
js操作cookie保存浏览记录的方法
Dec 25 Javascript
javascript 中的事件委托详解
Oct 25 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
Jan 08 Javascript
JS实现的类似微信聊天效果示例
Jan 29 Javascript
layui上传图片到服务器的非项目目录下的方法
Sep 26 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中的cookie
2006/11/26 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
学习php开源项目的源码指南
2014/12/21 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
JS 中document.URL 和 windows.location.href 的区别
2009/11/11 Javascript
jQuery 表单验证扩展(三)
2010/10/20 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
jQuery Easyui DataGrid点击某个单元格即进入编辑状态焦点移开后保存数据
2016/08/15 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
react实现antd线上主题动态切换功能
2019/08/12 Javascript
js实现带积分弹球小游戏
2020/07/21 Javascript
python调用cmd复制文件代码分享
2013/12/27 Python
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
python修改注册表终止360进程实例
2014/10/13 Python
解决Python中由于logging模块误用导致的内存泄露
2015/04/23 Python
Python2.7环境Flask框架安装简明教程【已测试】
2018/07/13 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
python飞机大战游戏实例讲解
2020/12/04 Python
纯CSS3实现的8种Loading动画效果
2014/07/05 HTML / CSS
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
Lucene推荐的分页方式是什么?
2015/12/07 面试题
高级人员简历的自我评价分享
2013/11/03 职场文书
护士自我评价范文
2014/01/25 职场文书
演讲比赛获奖感言
2014/02/02 职场文书
2014领导班子专题民主生活会对照检查材料思想汇报
2014/09/23 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
2014年商场工作总结
2014/11/22 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
2015年节能降耗工作总结
2015/05/22 职场文书
2015年治庸问责工作总结
2015/07/27 职场文书
微信小程序实现轮播图指示器
2022/06/25 Javascript
table不让td文字溢出操作方法
2022/12/24 HTML / CSS