vue如何實(shí)現(xiàn)級(jí)聯(lián)選擇器功能
vue實(shí)現(xiàn)級(jí)聯(lián)選擇器功能
vue開(kāi)發(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 和部門(mén) 測(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)聽(tīng)級(jí)聯(lián)選擇器值變化事件
handleChange(selectedValues) {
console.log('選中的值:', selectedValues);
}
},
created() {
// 設(shè)置初始化選中值為單位 '測(cè)試1' 和部門(mén) '測(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 和部門(mén) 測(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ù)形數(shù)組的節(jié)點(diǎn)值,但是在真實(shí)開(kāi)發(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)選擇器多選傳值以及回顯方式(樹(shù)形結(jié)構(gòu))
- vue?ElementUI級(jí)聯(lián)選擇器回顯問(wèn)題解決
相關(guān)文章
手寫(xiě)vue無(wú)限滾動(dòng)指令的詳細(xì)過(guò)程
今天在移動(dòng)端項(xiàng)目中遇見(jiàn)一個(gè)需求,需要數(shù)據(jù)無(wú)限滾動(dòng),所以下面這篇文章主要給大家介紹了關(guān)于手寫(xiě)vue無(wú)限滾動(dòng)指令的詳細(xì)過(guò)程,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
詳解vue 在移動(dòng)端體驗(yàn)上的優(yōu)化解決方案
這篇文章主要介紹了vue 在移動(dòng)端體驗(yàn)上的優(yōu)化解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
vue使用import.meta.glob動(dòng)態(tài)導(dǎo)入多個(gè)模塊方式
文章介紹了Vite提供的`import.meta.glob`功能,用于動(dòng)態(tài)導(dǎo)入多個(gè)模塊,它通過(guò)glob模式匹配文件,返回一個(gè)對(duì)象,鍵為文件路徑,值為返回Promise的動(dòng)態(tài)導(dǎo)入函數(shù),支持eager模式直接導(dǎo)入和as選項(xiàng)指定導(dǎo)入方式,如原始字符串或文件URL,適用于Vite或Rollup項(xiàng)目2025-10-10
解決vant框架做H5時(shí)踩過(guò)的坑(下拉刷新、上拉加載等)
這篇文章主要介紹了解決vant框架做H5時(shí)踩過(guò)的坑(下拉刷新、上拉加載等),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
element的el-table中記錄滾動(dòng)條位置的示例代碼
這篇文章主要介紹了element的el-table中記錄滾動(dòng)條位置的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

