vue2結(jié)合element-ui實(shí)現(xiàn)TreeSelect樹(shù)選擇功能
效果
大致思路
el-select和el-tree進(jìn)行嵌套,將el-tree放到el-option里,循環(huán)遍歷el-option,同時(shí)定義一個(gè)方法比如:formatData,對(duì)樹(shù)形數(shù)據(jù)進(jìn)行遞歸處理,這樣就可以實(shí)現(xiàn)無(wú)論嵌套的層級(jí)有幾層都可以正常渲染在界面上 利用 v-model 和 update:selectValue 實(shí)現(xiàn)父子組件之間的雙向通信,同時(shí)利用computed進(jìn)行監(jiān)聽(tīng)
vue代碼
子組件:TreeSelect.vue
<template> <div class="app-container" style="padding: 0"> <el-select class="main-select-tree" ref="selectTree" v-model="value" style="width: 240px" clearable @clear="clearSelectInput" > <el-input style="width: 220px; margin-left: 10px; margin-bottom: 10px" placeholder="輸入關(guān)鍵字進(jìn)行過(guò)濾" v-model="filterText" clearable > </el-input> <el-option v-for="item in formatData(data)" :key="item.value" :label="item.label" :value="item.value" style="display: none" /> <el-tree class="main-select-el-tree" ref="selecteltree" :data="data" node-key="id" highlight-current :props="defaultProps" @node-click="handleNodeClick" :current-node-key="value" :expand-on-click-node="true" default-expand-all :filter-node-method="filterNode" /> </el-select> </div> </template> <script> export default { props: { selectValue: { type: String, default: "", }, }, data() { return { filterText: "", value: "", data: [ { id: 1, label: "云南", children: [ { id: 2, label: "昆明", children: [ { id: 3, label: "五華區(qū)", children: [ { id: 8, label: "xx街道", children: [ { id: 81, label: "yy社區(qū)", children: [{ id: 82, label: "北辰小區(qū)" }], }, ], }, ], }, { id: 4, label: "盤(pán)龍區(qū)" }, ], }, ], }, { id: 5, label: "湖南", children: [ { id: 6, label: "長(zhǎng)沙" }, { id: 7, label: "永州" }, ], }, { id: 12, label: "重慶", children: [ { id: 10, label: "渝北" }, { id: 9, label: "合川" }, ], }, { id: 13, label: "江蘇", children: [{ id: 14, label: "鹽城" }], }, ], defaultProps: { children: "children", label: "label", }, }; }, watch: { filterText(val) { this.$refs.selecteltree.filter(val); }, }, methods: { filterNode(value, data) { if (!value) return true; return data.label.indexOf(value) !== -1; }, // 遞歸遍歷數(shù)據(jù) formatData(data) { let options = []; const formatDataRecursive = (data) => { data.forEach((item) => { options.push({ label: item.label, value: item.id }); if (item.children && item.children.length > 0) { formatDataRecursive(item.children); } }); }; formatDataRecursive(data); return options; }, // 點(diǎn)擊事件 handleNodeClick(node) { this.value = node.id; this.$refs.selectTree.blur(); this.$emit('update:selectValue', node.label); }, // 清空事件 clearSelectInput() { this.$emit('update:selectValue', ''); // 獲取 el-tree 實(shí)例的引用 const elTree = this.$refs.selecteltree; // 將當(dāng)前選中的節(jié)點(diǎn)設(shè)置為 null elTree.setCurrentKey(null); }, }, }; </script> <style> .main-select-el-tree .el-tree-node .is-current > .el-tree-node__content { font-weight: bold; color: #409eff; } .main-select-el-tree .el-tree-node.is-current > .el-tree-node__content { font-weight: bold; color: #409eff; } </style>
父組件:
<TreeSelect v-model="selectedValue" @update:selectValue="handleSelectValueChange"></TreeSelect> <el-button size="medium" :disabled="todoIsTotal">交接當(dāng)前{{ tableData.length }}條任務(wù)</el-button> import TreeSelect from "./TreeSelect.vue"; export default { components: { TreeSelect, }, data() { selectedValue: "", }, computed: { todoIsTotal() { return this.selectedValue === ""; }, }, methods: { handleSelectValueChange(value) { if (value && value.length > 0) { this.selectedValue = value; } else { this.selectedValue = ""; } }, }, }
到此這篇關(guān)于vue2結(jié)合element-ui實(shí)現(xiàn)TreeSelect樹(shù)選擇功能的文章就介紹到這了,更多相關(guān)vue2 element-ui實(shí)現(xiàn)TreeSelect樹(shù)選擇內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue之elementUi的el-select同時(shí)獲取value和label的三種方式
- vue3?element?plus?table?selection展示數(shù)據(jù),默認(rèn)選中功能方式
- Vue?elementui如何實(shí)現(xiàn)表格selection的默認(rèn)勾選
- vue-treeselect(適配Vue3.2)及Element-plus的TreeSelect組件使用
- vue elementui select標(biāo)簽監(jiān)聽(tīng)change事件失效問(wèn)題
- Vue中使用 ElementUi 的 el-select 實(shí)現(xiàn)全選功能(思路詳解)
- Vue Element如何獲取select選擇框選擇的value和label
相關(guān)文章
Vue.js實(shí)現(xiàn)全屏背景圖片滑動(dòng)切換特效
本文主要介紹了Vue.js實(shí)現(xiàn)全屏背景圖片滑動(dòng)切換特效,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01elementui?el-table底層背景色修改簡(jiǎn)單方法
最近在做項(xiàng)目的時(shí)候遇到個(gè)需求,需要修改el-table背景色,這里給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于elementui?el-table底層背景色修改的相關(guān)資料,需要的朋友可以參考下2023-10-10Vue自定義Hook實(shí)現(xiàn)簡(jiǎn)化本地存儲(chǔ)
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)使用 Vue 3 的 Composition API 創(chuàng)建一個(gè)強(qiáng)大而靈活的自定義 Hook,簡(jiǎn)化了在 localStorage 或 sessionStorage 中管理數(shù)據(jù)的流程,需要的可以參考下2023-12-12Vue子組件props從父組件接收數(shù)據(jù)并存入data
這篇文章主要介紹了Vue子組件props從父組件接收數(shù)據(jù)并存入data的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08element-plus一個(gè)vue3.xUI框架(element-ui的3.x 版初體驗(yàn))
這篇文章主要介紹了element-plus一個(gè)vue3.xUI框架(element-ui的3.x 版初體驗(yàn)),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12vue實(shí)現(xiàn)圖片加載完成前的loading組件方法
下面小編就為大家分享一篇vue實(shí)現(xiàn)圖片加載完成前的loading組件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02vue+axios實(shí)現(xiàn)文件上傳的實(shí)時(shí)進(jìn)度條
最近用vue寫(xiě)上傳的時(shí)候,遇到一個(gè)需求就是頁(yè)面上展示上傳的進(jìn)度條,之后寫(xiě)過(guò)一次,但是用的是假交互,直接從0-100,今天分享一下用axios自帶的onUploadProgress來(lái)完成這個(gè)小需求,感興趣的朋友可以參考下2024-01-01vue項(xiàng)目中封裝echarts的優(yōu)雅方式分享
在實(shí)際項(xiàng)目開(kāi)發(fā)中,我們會(huì)經(jīng)常與圖表打交道,比如?訂單數(shù)量表、商品銷量表、會(huì)員數(shù)量表等等,它可能是以折線圖、柱狀圖、餅狀圖等等的方式來(lái)展現(xiàn),下面這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目中封裝echarts的優(yōu)雅方式的相關(guān)資料,需要的朋友可以參考下2022-03-03