ElementUI 的 Tree 組件的基本使用實(shí)戰(zhàn)教程
起因
事情是這樣的,項(xiàng)目最近有個(gè)需求。服務(wù)器有個(gè)圖片空間,說白了就是個(gè)文件夾。文件夾的結(jié)構(gòu)大家都知道,一層一層的。然后需要在前端以樹形展示。
具體的需求如下
- 可以新建子目錄,但是只能新建二級,三級的時(shí)候新建按鈕置灰。
- 在頁面上展示父級目錄名稱和當(dāng)前所在路徑,用 ‘/’ 分隔。
- 根目錄固定為 圖片空間 。
- 頁面首次打開的時(shí)候,請求接口,只返回一級目錄,默認(rèn)展示所有一級目錄。
- 用戶點(diǎn)擊一級目錄,根據(jù)所點(diǎn)擊的一級目錄對應(yīng)的 id 請求接口返回二級目錄,以此類推。
我當(dāng)時(shí)看到這個(gè)需求的時(shí)候,心里想,這玩意我在 ElementUI 的官網(wǎng)見過,好說。結(jié)果當(dāng)我去開發(fā)的時(shí)候,發(fā)現(xiàn)還是挺復(fù)雜的,于是我就花了點(diǎn)時(shí)間了研究一下,以防下次用的時(shí)候忘了。
處理
先把 elementUI 的官方例子拷下來。然后又隨便添加了點(diǎn)內(nèi)容。
<template>
<div>
<el-input v-model="input"
style="width:200px"
placeholder="請輸入內(nèi)容"></el-input>
<el-button type="primary">添加節(jié)點(diǎn)</el-button>
<span>當(dāng)前目錄:</span>
<span>當(dāng)前目錄的父級目錄:</span>
<el-tree :data="data"
:props="defaultProps"
accordion
@node-click="handleNodeClick"></el-tree>
</div>
</template>
<script>
export default {
data() {
return {
input: '',
data: [{
label: '圖片空間',
children: [{
label: '蔬菜',
children: [{
label: '菠菜',
},
{
label: '生菜',
},
],
},
{
label: '水果',
children: [{
label: '香蕉',
}],
},
{
label: '美女',
children: [{
label: '秦嵐',
}],
}],
}],
defaultProps: {
children: 'children',
label: 'label',
},
};
},
methods: {
handleNodeClick(data) {
console.log(data);
},
},
};
</script>
現(xiàn)在的界面是這樣的。

需求一
先從最簡單的開始吧。在任意目錄下添加分類(子節(jié)點(diǎn))。
然后我們?nèi)タ次臋n怎么說。嗯,就是它了。

接收兩個(gè)參數(shù) (data, parentNode)
- 要追加的子節(jié)點(diǎn)的
data - 子節(jié)點(diǎn)的
parent的data、key或者node
第一個(gè)參數(shù) data 在當(dāng)前的例子中就是一個(gè)名字而已。第二個(gè)參數(shù)要傳的東西怎么獲取呢?
要給目錄添加子節(jié)點(diǎn),肯定要先點(diǎn)一下這個(gè)目錄,那我們看看點(diǎn)擊事件都能給我們返回什么東西。

可以看到第二個(gè)回調(diào)參數(shù)就是 節(jié)點(diǎn)對應(yīng)的node , 這不就有了么!那就來試一下。
修改代碼如下,我們點(diǎn)擊節(jié)點(diǎn)的時(shí)候,把點(diǎn)擊事件回調(diào)的參數(shù) node 先存在變量 nowClickNode 中,然后我們調(diào)用 append 方法的時(shí)候,再把 nowClickNode 給傳過去。
// 為了節(jié)省篇幅,省略template中的代碼,文末會貼出整體代碼
methods: {
// 點(diǎn)擊節(jié)點(diǎn)
handleNodeClick(nodes, node, self) {
this.nowClickNode = node;
},
// 添加節(jié)點(diǎn)
addSort() {
const data = {
label: '草莓',
};
this.$refs.tree.append(data, this.nowClickNode);
},
},成功啦!

那么怎么實(shí)現(xiàn)只可以建二級目錄,三級的時(shí)候置灰呢,我們點(diǎn)擊的時(shí)候不是保存了一個(gè)變量 nowClickNode 么。
這個(gè)變量里面有個(gè) level 屬性,代表的就是層級。我通過計(jì)算屬性來完成這個(gè)需求。
//template
<el-button type="primary"
:disabled='isDisabled'
@click='addSort'>添加節(jié)點(diǎn)</el-button>
//js
computed: {
// 是否可以新建分類
isDisabled() {
if (this.nowClickNode.level > 2) {
return true;
}
return false;
},
},可以看到我們點(diǎn)擊到三級的時(shí)候按鈕就禁用了。

需求二
接下來我們實(shí)現(xiàn)第二個(gè)需求,顯示當(dāng)前所在路徑和父級目錄。這個(gè)示例圖看上面那張就可以了,已經(jīng)實(shí)現(xiàn)了。
// 點(diǎn)擊節(jié)點(diǎn)的時(shí)候觸發(fā)事件
handleNodeClick(nodes, node, self) {
this.nowClickNode = node;
this.nowPathArr = [];
// 如果不是根節(jié)點(diǎn)
if (node.parent.parent) {
this.faterName = node.parent.data.label;
// 遞歸找路徑
this.findParentName(node);
// 拼接路徑
this.nowPath = `圖片空間 / ${this.nowPathArr.join(' / ')}`;
} else {
// 如果是根節(jié)點(diǎn) 直接賦值
this.nowPath = '圖片空間';
this.faterName = '- -';
}
},
// 查找父節(jié)點(diǎn)的分類名稱
findParentName(node) {
if (node.parent.parent) {
this.nowPathArr.unshift(node.data.label);
this.findParentName(node.parent);
}
},
這個(gè)不知道怎么回事,我的根目錄也有 parent 屬性,所以只能再向上找一層,通過 parent.parent 存不存在來判斷是不是根節(jié)點(diǎn)。
我是在點(diǎn)擊的時(shí)候,遞歸查找點(diǎn)擊節(jié)點(diǎn)的父元素,然后把所有祖代元素放在數(shù)組里,最后進(jìn)行拼接。
需求三,四,五
剩下的三個(gè)需求放在一起講,這個(gè)地方我練習(xí)的時(shí)候用的項(xiàng)目真實(shí)數(shù)據(jù),不方便演示,代碼也是經(jīng)過脫敏處理的。重要的是知道怎么用就可以了。
//template
<el-tree
:data="treeData" //數(shù)據(jù)源
:props="defaultProps" //配置項(xiàng)
accordion //每次打開一個(gè)節(jié)點(diǎn) 手風(fēng)琴模式
ref="tree" //用來獲取dom
lazy //節(jié)點(diǎn)懶加載
:highlight-current='true' //高亮當(dāng)前節(jié)點(diǎn)
:load='treeLoad' //懶加載時(shí)調(diào)用的方法
node-key="cateId" //唯一標(biāo)識
:default-expanded-keys='defaultOpen' //默認(rèn)打開的節(jié)點(diǎn)數(shù)組
:expand-on-click-node='true' //是否在點(diǎn)擊節(jié)點(diǎn)的時(shí)候展開或者收縮節(jié)點(diǎn), 默認(rèn)值為 true,如果為 false,則只有點(diǎn)箭頭圖標(biāo)的時(shí)候才會展開或者收縮節(jié)點(diǎn)。
@node-click="handleNodeClick" //點(diǎn)擊節(jié)點(diǎn)的回調(diào)函數(shù)
>
</el-tree>
//js
// 加載樹形結(jié)構(gòu) 就是上面懶加載綁定的函數(shù)
treeLoad(node, resolve) {
// 判斷節(jié)點(diǎn)等級
if (node.level == 0) {
// 如果是根節(jié)點(diǎn),添加一個(gè)固定的圖片空間節(jié)點(diǎn) 這是實(shí)現(xiàn)需求三
resolve([{
cateName: '圖片空間',
cateId: '0',
children: [],
}]);
}
// 不是根節(jié)點(diǎn),調(diào)取接口加載列表 這里實(shí)現(xiàn)需求四,五的樹結(jié)構(gòu)懶加載,點(diǎn)完一級請求一級的數(shù)據(jù)
if (node.level >= 1) {
this.getCategoryListNew(node, resolve);
// 防止子節(jié)點(diǎn)為空時(shí)一直出現(xiàn)加載動畫
return resolve([]);
}
},
// 獲取樹形結(jié)構(gòu) 上面掉用的請求接口 data處理完之后要調(diào)用resolve方法
getCategoryListNew(node, resolve) {
Service.getCategoryListNew({ parentId: node.data.cateId }).then(({ data }) => {
resolve(data);
}).catch((e) => {
console.log(e);
});
},
其他知識點(diǎn)
另外記錄幾個(gè)知識點(diǎn)
默認(rèn)展開節(jié)點(diǎn)
默認(rèn)展開使用的是 :default-expanded-keys='defaultOpen' 屬性, defaultOpen 里面存放的是 node-key 的數(shù)組。
橫縱向滾動條
首先要給 tree 組件的外層添加 寬高 ,以及 overflow 屬性。然后要修改 el-tree 的屬性。
.tree-box{
width: 200px;
height: calc(100% - 30px);
overflow:auto;
}
.el-tree {
display: inline-block;
min-width: 100%;
}刷新某一個(gè)節(jié)點(diǎn)
// 通過節(jié)點(diǎn)id找到對應(yīng)樹節(jié)點(diǎn)對象 const node = this.$refs.tree.getNode(this.nodeId); // 把loaded手動置為false,也就是告訴tree這個(gè)節(jié)點(diǎn)沒有加載過 node.loaded = false; // 主動調(diào)用展開節(jié)點(diǎn)方法,重新查詢該節(jié)點(diǎn)下的所有子節(jié)點(diǎn) node.expand();
模擬點(diǎn)擊一級目錄中第一個(gè)節(jié)點(diǎn)
// 選取dom
const root = document.querySelector('.el-tree-node__children');
// 找到目標(biāo)節(jié)點(diǎn)
const firstNode = root.firstChild;
// 模擬點(diǎn)擊
firstNode.click();到此這篇關(guān)于ElementUI 的 Tree 組件的基本使用實(shí)戰(zhàn)教程的文章就介紹到這了,更多相關(guān)ElementUI 的 Tree 組件使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js金額千分位的6種實(shí)現(xiàn)方法實(shí)例
在前端開發(fā)中經(jīng)常會遇到這樣一種需求,使用Javascript格式化數(shù)字進(jìn)行輸出,下面這篇文章主要給大家介紹了關(guān)于js金額千分位的6種實(shí)現(xiàn)方法,需要的朋友可以參考下2022-03-03
詳解JavaScript中的鏈?zhǔn)秸{(diào)用
這篇文章主要介紹了JavaScript中的鏈?zhǔn)秸{(diào)用的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)JavaScript,感興趣的朋友可以了解下2020-11-11
微信小程序 scroll-view實(shí)現(xiàn)錨點(diǎn)滑動的示例
本篇文章主要介紹了微信小程序 scroll-view實(shí)現(xiàn)錨點(diǎn)滑動的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
JS數(shù)組屬性去重并校驗(yàn)重復(fù)數(shù)據(jù)
這篇文章主要介紹了JS數(shù)組屬性去重并校驗(yàn)重復(fù)數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
JavaScript中使用參數(shù)個(gè)數(shù)實(shí)現(xiàn)重載功能
這篇文章主要介紹了JavaScript中使用參數(shù)個(gè)數(shù)實(shí)現(xiàn)重載功能,需要的朋友可以參考下2017-09-09
淺析JavaScript中的call、apply和bind方法
JavaScript中的call、apply和bind方法是用于改變函數(shù)執(zhí)行上下文和預(yù)先設(shè)置參數(shù)的強(qiáng)大工具,它們在編寫可維護(hù)和優(yōu)雅的代碼時(shí)起到了重要的作用,本文將介紹這些方法的原理和使用場景,并展示如何將它們應(yīng)用于你的代碼中,使其更加漂亮2023-06-06
重載toString實(shí)現(xiàn)JS HashMap分析
用過Java的都知道,里面有個(gè)功能強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)——HashMap,它能提供鍵與值的對應(yīng)訪問。不過熟悉JS的朋友也會說,JS里面到處都是hashmap,因?yàn)槊總€(gè)對象都提供了map[key]的訪問形式。2011-03-03
Bootstrap輪播插件中圖片變形的終極解決方案 使用jqthumb.js
這篇文章主要介紹了Bootstrap輪播插件中圖片變形的終極解決方案,使用jqthumb.js,感興趣的小伙伴們可以參考一下2016-07-07
JavaScript實(shí)現(xiàn)圖片放大鏡效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)圖片放大鏡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06

