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)文章
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-02Vue實(shí)現(xiàn)漸變色進(jìn)度條的代碼
這篇文章主要介紹了Vue實(shí)現(xiàn)漸變色進(jìn)度條的代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04vue-cli 2.*中導(dǎo)入公共less文件的方法步驟
這篇文章主要介紹了vue-cli 2.*中導(dǎo)入公共less文件的方法步驟,小編覺(jué)得挺不錯(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)簽分類(lèi)等功能,需要的朋友可以參考學(xué)習(xí)。2017-04-04vue excel上傳預(yù)覽和table內(nèi)容下載到excel文件中
這篇文章主要介紹了vue excel上傳預(yù)覽和table內(nèi)容下載到excel文件中,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-12-12vue事件監(jiān)聽(tīng)函數(shù)on中的this指針域使用
這篇文章主要介紹了vue事件監(jiān)聽(tīng)函數(shù)on中的this指針域使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08Vue源碼探究之虛擬節(jié)點(diǎn)的實(shí)現(xiàn)
這篇文章主要介紹了Vue源碼探究之虛擬節(jié)點(diǎn)的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04