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 相关文章推荐
在网页里看flash的trace数据的js类
Jan 10 Javascript
在JavaScript里嵌入大量字符串常量的实现方法
Jul 07 Javascript
随鼠标上下滚动的jquery代码
Dec 05 Javascript
javascript怎么禁用浏览器后退按钮
Mar 27 Javascript
JavaScript每天必学之基础知识
Sep 17 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
Sep 24 Javascript
使用Javascript监控前端相关数据的代码
Oct 27 Javascript
Html5+jQuery+CSS制作相册小记录
Dec 30 Javascript
vue select选择框数据变化监听方法
Aug 24 Javascript
ng-zorro-antd 入门初体验
Dec 03 Javascript
基于Vue.js与WordPress Rest API构建单页应用详解
Sep 16 Javascript
Vue3项目打包后部署到服务器 请求不到后台接口解决方法
Feb 06 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
CodeIgniter读写分离实现方法详解
2016/01/20 PHP
php文件系统处理方法小结
2016/05/23 PHP
详解PHP中的 input属性(隐藏 只读 限制)
2017/08/14 PHP
php 二维数组快速排序算法的实现代码
2017/10/17 PHP
php session_decode函数用法讲解
2019/05/26 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
2020/03/26 PHP
javascript编程起步(第七课)
2007/01/10 Javascript
JS 控制非法字符的输入代码
2009/12/04 Javascript
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
使用JS读秒使用示例
2013/09/21 Javascript
JavaScript中一个奇葩的IE浏览器判断方法
2014/04/16 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
javascript模块化简单解析
2016/04/07 Javascript
javascript中的后退和刷新实现方法
2016/11/10 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
python去掉字符串中重复字符的方法
2014/02/27 Python
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
Python实现登录接口的示例代码
2017/07/21 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
python如何建立全零数组
2020/07/19 Python
利用python实现后端写网页(flask框架)
2021/02/28 Python
CSS3 仿微信聊天小气泡实例代码
2017/04/05 HTML / CSS
Html5监听手机摇一摇事件的实现
2019/11/07 HTML / CSS
先进事迹报告会感言
2014/01/24 职场文书
我爱家乡演讲稿
2014/09/12 职场文书
会议开幕致辞怎么写
2016/03/03 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书