vue2結(jié)合element-ui實現(xiàn)TreeSelect樹選擇功能
效果

大致思路
el-select和el-tree進行嵌套,將el-tree放到el-option里,循環(huán)遍歷el-option,同時定義一個方法比如:formatData,對樹形數(shù)據(jù)進行遞歸處理,這樣就可以實現(xiàn)無論嵌套的層級有幾層都可以正常渲染在界面上 利用 v-model 和 update:selectValue 實現(xiàn)父子組件之間的雙向通信,同時利用computed進行監(jiān)聽
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)鍵字進行過濾"
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: "盤龍區(qū)" },
],
},
],
},
{
id: 5,
label: "湖南",
children: [
{ id: 6, label: "長沙" },
{ 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;
},
// 點擊事件
handleNodeClick(node) {
this.value = node.id;
this.$refs.selectTree.blur();
this.$emit('update:selectValue', node.label);
},
// 清空事件
clearSelectInput() {
this.$emit('update:selectValue', '');
// 獲取 el-tree 實例的引用
const elTree = this.$refs.selecteltree;
// 將當(dāng)前選中的節(jié)點設(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實現(xiàn)TreeSelect樹選擇功能的文章就介紹到這了,更多相關(guān)vue2 element-ui實現(xiàn)TreeSelect樹選擇內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue之elementUi的el-select同時獲取value和label的三種方式
- vue3?element?plus?table?selection展示數(shù)據(jù),默認(rèn)選中功能方式
- Vue?elementui如何實現(xiàn)表格selection的默認(rèn)勾選
- vue-treeselect(適配Vue3.2)及Element-plus的TreeSelect組件使用
- vue elementui select標(biāo)簽監(jiān)聽change事件失效問題
- Vue中使用 ElementUi 的 el-select 實現(xiàn)全選功能(思路詳解)
- Vue Element如何獲取select選擇框選擇的value和label
相關(guān)文章
vue實現(xiàn)token過期自動跳轉(zhuǎn)到登錄頁面
本文主要介紹了vue實現(xiàn)token過期自動跳轉(zhuǎn)到登錄頁面,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10
vue數(shù)據(jù)雙向綁定原理解析(get & set)
這篇文章主要為大家詳細(xì)解析了vue.js數(shù)據(jù)雙向綁定原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03
Vue3集成Leaflet實現(xiàn)一個功能完整的地圖可視化組件
在現(xiàn)代 Web 應(yīng)用中,地圖可視化是一個常見的需求,無論是展示位置信息、軌跡追蹤,還是數(shù)據(jù)統(tǒng)計分析,地圖都能提供直觀的視覺體驗,本文將詳細(xì)介紹如何在 Vue 3 項目中集成 Leaflet 地圖庫,實現(xiàn)一個功能完整的地圖可視化組件,需要的朋友可以參考下2026-01-01
springboot+vue使用流式響應(yīng)的實現(xiàn)示例
本文主要介紹了springboot+vue使用流式響應(yīng)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-02-02

