Element中的Cascader(級(jí)聯(lián)列表)動(dòng)態(tài)加載省\市\(zhòng)區(qū)數(shù)據(jù)的方法
element中的cascader其實(shí)是有動(dòng)態(tài)加載次級(jí)選項(xiàng)的方法。
方法的原理是利用址(引用)傳遞,動(dòng)態(tài)修改: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
其中找到究竟需要在那層添加數(shù)據(jù)就變成一個(gè)很麻煩的問題。
怎么找了?
當(dāng)然只能遞歸了。

簡(jiǎn)化一下大致思路:
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數(shù)組第一個(gè)元素以外的全部元素。
if (_.isEmpty(tailRegionArr)) {
return regionOption
}
return this.findRegionOption(regionOption.children, tailRegionArr)
}
動(dòng)態(tài)加載數(shù)據(jù):
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 // 動(dòng)態(tài)加載賦值
})
}
整個(gè)頁(yè)面代碼大致就是:
<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: '中華人民共和國(guó)', 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 //后臺(tái)返回?cái)?shù)據(jù)
regionOptionInUI.children = regionChildrenTransfomed
})
},
}
}
</script>
整體思路還是找到點(diǎn)擊后的region,然后動(dòng)態(tài)賦值給children。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談vue引用靜態(tài)資源需要注意的事項(xiàng)
今天小編就為大家分享一篇淺談vue引用靜態(tài)資源需要注意的事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09
基于vue2.0動(dòng)態(tài)組件及render詳解
下面小編就為大家分享一篇基于vue2.0動(dòng)態(tài)組件及render詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03
使用Webstorm調(diào)試Vue代碼詳細(xì)圖文教程
WebStorm是一款優(yōu)秀的前端開發(fā)IDE,之前一直可以調(diào)試Vue項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于使用Webstorm調(diào)試Vue代碼的詳細(xì)圖文教程,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
vue-music關(guān)于Player播放器組件詳解
這篇文章主要為大家詳細(xì)介紹了vue-music關(guān)于Player播放器組件的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11
Vue實(shí)現(xiàn)簡(jiǎn)易計(jì)算器
這篇文章主要為大家詳細(xì)介紹了用Vue制作的簡(jiǎn)易計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02
詳解Vue組件之間的數(shù)據(jù)通信實(shí)例
本篇文章主要介紹了詳解Vue組件之間的數(shù)據(jù)通信實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06

