vue如何實(shí)現(xiàn)級(jí)聯(lián)選擇器功能
vue實(shí)現(xiàn)級(jí)聯(lián)選擇器功能
vue開發(fā)中,通過(guò)使用 Element UI 的 el-cascader 組件來(lái)實(shí)現(xiàn)級(jí)聯(lián)選擇器功能
下面是一個(gè)示例代碼:
演示如何使用 el-cascader 組件初始化級(jí)聯(lián)選擇器,并設(shè)置默認(rèn)值為單位 測(cè)試1 和部門 測(cè)試11
<template>
<div>
<el-cascader
v-model="selectedValues"
:options="options"
:props="props"
@change="handleChange"
placeholder="請(qǐng)選擇"
></el-cascader>
</div>
</template><script>
export default {
data() {
return {
// 初始化級(jí)聯(lián)選擇器的選中值
selectedValues: [],
// 級(jí)聯(lián)選擇器的數(shù)據(jù)源
options: [
{
value: '1',
label: '測(cè)試1',
children: [
{ value: '2', label: '測(cè)試11' },
{ value: '3', label: '測(cè)試12' }
]
}
],
// 自定義配置,用于指定數(shù)據(jù)結(jié)構(gòu)中的屬性名
props: {
value: 'value',
label: 'label',
children: 'children'
}
};
},
methods: {
// 監(jiān)聽級(jí)聯(lián)選擇器值變化事件
handleChange(selectedValues) {
console.log('選中的值:', selectedValues);
}
},
created() {
// 設(shè)置初始化選中值為單位 '測(cè)試1' 和部門 '測(cè)試12'
this.selectedValues = ['1', '3'];
}
};
</script>在這個(gè)示例中:
options 數(shù)組包含了級(jí)聯(lián)選擇器的數(shù)據(jù)源,其中每個(gè)對(duì)象表示一個(gè)選項(xiàng),包括 value、label 和 children 屬性。
props 對(duì)象用于指定數(shù)據(jù)結(jié)構(gòu)中的屬性名,以便 el-cascader 組件正確地解析數(shù)據(jù)。
通過(guò)在 selectedValues 中設(shè)置初始選中值為單位 測(cè)試1 和部門 測(cè)試12,并將其綁定到 el-cascader 組件的 v-model 上,可以在初始化時(shí)選中指定的值。
vue級(jí)聯(lián)選擇器只傳最后一級(jí)
elementUI的級(jí)聯(lián)選擇器的v-modle接受的參數(shù)是一個(gè)數(shù)組,數(shù)組中的值是對(duì)應(yīng)樹形數(shù)組的節(jié)點(diǎn)值,但是在真實(shí)開發(fā)中后端可能只給返回了某一處單一節(jié)點(diǎn),對(duì)el-cascader進(jìn)行2次封裝實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)
import arrayTreeFilter from 'array-tree-filter'
/*
* 雙層遞歸逆向查找某一節(jié)點(diǎn)的所有父級(jí)
* */
const findPatentValue = (array, value, valueName = 'value', childrenName = 'children') => {
if (!value || !Array.isArray(array)) return []
const result = []
let valid = false
const seek = (array, value) => {
let parentValue = ''
const up = (array, value, lastValue) => {
array.forEach(v => {
const val = v[valueName]
const child = v[childrenName]
if (val === value) {
valid = true
parentValue = lastValue
return
}
if (child && child.length) up(child, value, val)
})
}
up(array, value)
if (parentValue) {
result.unshift(parentValue)
seek(array, parentValue)
}
}
seek(array, value)
return valid ? [...result, value] : []
}
/*
* 該組件主要是通過(guò)后端傳入的節(jié)點(diǎn)值來(lái)實(shí)現(xiàn)級(jí)聯(lián)的雙向數(shù)據(jù)綁定
* */
export default {
model: {
prop: 'value',
event: 'change'
},
props: {
value: {
type: String,
default: ''
},
options: {
type: Array,
default() {
return []
}
},
config: {
type: Object,
default() {
return {
value: 'value',
label: 'label',
children: 'children'
}
}
}
},
data() {
return {
result: []
}
},
watch: {
value() {
this.setResult()
},
options() {
this.setResult()
}
},
mounted() {
this.setResult()
},
methods: {
setResult() {
const {config, options, value} = this
const {value: valueName, children: childrenName} = config
this.result = findPatentValue(options, value, valueName, childrenName)
console.log(this.result)
},
/*
* 當(dāng)級(jí)聯(lián)選擇器變化時(shí)候會(huì)觸發(fā)該事件
* 向父級(jí)傳遞change事件來(lái)返回選中的節(jié)點(diǎn)id
* 向父級(jí)傳遞realChange事件來(lái)返回選中的節(jié)點(diǎn)及其所有父節(jié)點(diǎn)和選中的所有l(wèi)abel的值
* arrayTreeFilter 第三方庫(kù)用于篩查出選中的節(jié)點(diǎn)及其父節(jié)點(diǎn)
* */
areaChange(v = []) {
this.result = v
const value = v[v.length - 1] || ''
this.$emit('change', value)
const {options, config} = this
const {value: valueName, label: labelName} = config
const areas = arrayTreeFilter(options, (item, level) => item[valueName] === v[level])
.map(o => o[labelName])
this.$emit('realChange', v, areas)
},
},
render(createElement) {
const {areaChange, config, result} = this
const {value, label} = config
return createElement('el-cascader', {
props: {
options: this.options,
value: result,
size: 'small',
clearable: true,
placeholder: '請(qǐng)選擇',
props: {
value,
label,
checkStrictly: true
}
},
on: {
change: areaChange
}
})
}
}
<ChoiceArea v-model="memberForm.regionCode" :options="areaOptions"
:config="{value: 'code', label: 'name', children: 'children'}"
@realChange="choiceAreaChange"
/>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- vue element Cascader級(jí)聯(lián)選擇器解決最后一級(jí)顯示空白問(wèn)題
- vue+element多選級(jí)聯(lián)選擇器自定義props使用詳解
- vue element-ui el-cascader級(jí)聯(lián)選擇器數(shù)據(jù)回顯的兩種實(shí)現(xiàn)方法
- vue項(xiàng)目element-ui級(jí)聯(lián)選擇器el-cascader回顯的問(wèn)題及解決
- Vue之Element級(jí)聯(lián)選擇器多選傳值以及回顯方式(樹形結(jié)構(gòu))
- vue?ElementUI級(jí)聯(lián)選擇器回顯問(wèn)題解決
相關(guān)文章
MAC+PyCharm+Flask+Vue.js搭建系統(tǒng)
最近新做了個(gè)項(xiàng)目,使用的是MAC+PyCharm+Flask+Vue.js搭建系統(tǒng),本文就來(lái)分享一下搭建步驟,感興趣的可以了解一下2021-05-05
集成vue到j(luò)query/bootstrap項(xiàng)目的方法
下面小編就為大家分享一篇集成vue到j(luò)query/bootstrap項(xiàng)目的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Vue實(shí)現(xiàn)漸變色進(jìn)度條的代碼
這篇文章主要介紹了Vue實(shí)現(xiàn)漸變色進(jìn)度條的代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
vue-cli 2.*中導(dǎo)入公共less文件的方法步驟
這篇文章主要介紹了vue-cli 2.*中導(dǎo)入公共less文件的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
利用Vue.js+Node.js+MongoDB實(shí)現(xiàn)一個(gè)博客系統(tǒng)(附源碼)
本文主要介紹了利用Vue.js+Node.js+MongoDB實(shí)現(xiàn)一個(gè)博客系統(tǒng),這個(gè)博客使用Vue做前端框架,Node+express做后端,數(shù)據(jù)庫(kù)使用的是MongoDB。實(shí)現(xiàn)了用戶注冊(cè)、用戶登錄、博客管理、文章編輯、標(biāo)簽分類等功能,需要的朋友可以參考學(xué)習(xí)。2017-04-04
vue excel上傳預(yù)覽和table內(nèi)容下載到excel文件中
這篇文章主要介紹了vue excel上傳預(yù)覽和table內(nèi)容下載到excel文件中,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12
vue事件監(jiān)聽函數(shù)on中的this指針域使用
這篇文章主要介紹了vue事件監(jiān)聽函數(shù)on中的this指針域使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
Vue源碼探究之虛擬節(jié)點(diǎn)的實(shí)現(xiàn)
這篇文章主要介紹了Vue源碼探究之虛擬節(jié)點(diǎn)的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04

