摘要:此頁面是實(shí)現(xiàn)樹表格的關(guān)健頁面。這里就是關(guān)健點(diǎn),因?yàn)檫@個(gè)子組件是需要遞歸實(shí)現(xiàn),所以,需要?jiǎng)討B(tài)注冊(cè)到當(dāng)前組件中。補(bǔ)充一點(diǎn)不要只看部分,部分才是這個(gè)樹表格的關(guān)健所在。
基于vue.js實(shí)現(xiàn)樹形表格的封裝(vue-tree-table) 前言
由于公司產(chǎn)品(基于vue.js)需要,要實(shí)現(xiàn)一個(gè)樹形表格的功能,百度、google找了一通,并沒有發(fā)現(xiàn)很靠譜的,也不是很靈活。所以就用vue自己擼了一個(gè),還望大家多多指教。主要技術(shù)點(diǎn):vue子組件的遞歸實(shí)現(xiàn)及相關(guān)樣式的實(shí)現(xiàn) 樹形表格實(shí)現(xiàn)
效果圖(Demo)
主要代碼
index.vue頁面實(shí)現(xiàn)業(yè)務(wù)邏輯代碼,比如樹表格上面的一些操作按鈕的實(shí)現(xiàn)及數(shù)據(jù)獲取。
樹表格實(shí)現(xiàn)
原始數(shù)據(jù)`list`:是不包含子數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),即沒有層級(jí)結(jié)構(gòu),例如: [{id:111,parentId:0,name:"父及"},{id:111,parentId:111,name:"子級(jí)"}...],通過parentId來獲取對(duì)應(yīng)父子層級(jí)結(jié)構(gòu) `treeDataSource`:是樹表格需要的數(shù)據(jù)結(jié)構(gòu),例如: [{id:0,name:"父及",children:[{id:10,name:"子級(jí)",children:[]}]},...]
如果后臺(tái)返回給你的是原始數(shù)據(jù)格式,就可以用下面方法封裝成樹表格可以使用的數(shù)據(jù)結(jié)構(gòu):
getTreeData() { // 取父節(jié)點(diǎn) let parentArr = this.list.filter(l => l.parentId === 0) this.treeDataSource = this.getTreeData(this.list, parentArr) }, // 這里處理沒有children結(jié)構(gòu)的數(shù)據(jù) getTreeData(list, dataArr) { dataArr.map((pNode, i) => { let childObj = [] list.map((cNode, j) => { if (pNode.Id === cNode.parentId) { childObj.push(cNode) } }) pNode.children = childObj if (childObj.length > 0) { this.getTreeData(list, childObj) } }) return dataArr }
tree-table.vue頁面。此頁面是實(shí)現(xiàn)樹表格的關(guān)健頁面。主要代碼如下:
職位名稱 負(fù)責(zé)人 創(chuàng)建時(shí)間 工作經(jīng)驗(yàn) 發(fā)布時(shí)間 操作
首先這里的子組件tree-item沒有在頁面上有引入,但是也可以正常使用。這里就是關(guān)健點(diǎn),因?yàn)檫@個(gè)子組件是需要遞歸實(shí)現(xiàn),所以,需要?jiǎng)討B(tài)注冊(cè)到當(dāng)前組件中。代碼如下(由于代碼太多,先貼圖說明吧,點(diǎn)擊這里可以看源碼):
這里子組件看起來是不是挺奇怪的,但是為了遞歸他本身,暫時(shí)也只想到這種辦法。如果有更好的辦法,歡迎留言指正。
那么,樹表格的結(jié)構(gòu)實(shí)現(xiàn)在哪里呢??對(duì),就是在子組件的模版(template)里面,這里就不貼代碼了,可以移步到源碼查看。
感謝
收到favourli的指正,現(xiàn)已將原有寫法更新,采用遞歸組件來實(shí)現(xiàn),這樣頁面看起來就更清晰。
components: { treeItem: () => import("./tree-item.vue") }
補(bǔ)充一點(diǎn):不要只看js部分,css部分才是這個(gè)樹表格的關(guān)健所在。當(dāng)然里面我采用了大量的計(jì)算屬性去判斷各種樣式的展示,還有一種方法,就是在initTreeData方法里面去實(shí)現(xiàn),這個(gè)方法就是處理或添加一些我們樹表格所使用的信息。比如我現(xiàn)在在里面實(shí)現(xiàn)的層級(jí)線的偏移量m.bLeft = level === 1 ? 34 : (level - 2) * 16 + 34 這個(gè)計(jì)算如果沒有看明白,可以留言。
最后,此篇乃我的開篇之作,如有問題,還請(qǐng)多多包含,多多指教?。?!順便給我好久沒有更新的博客打個(gè)廣告,
歡迎點(diǎn)擊(一座城池)
源碼地址github,歡迎star。
參考資源隔壁家的老黃
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/108125.html
摘要:由于目前還未開發(fā)樹形表格組件,也參閱了網(wǎng)絡(luò)上部分基于表格封裝的開源樹形組件,都沒有找的太理想可進(jìn)行二次開發(fā)的開源項(xiàng)目,所以就萌生了自行開發(fā)樹形表格。 由于ElementUI目前還未開發(fā)樹形表格組件,也參閱了網(wǎng)絡(luò)上部分基于ElementUI表格封裝的開源樹形組件,都沒有找的太理想可進(jìn)行二次開發(fā)的開源項(xiàng)目,所以就萌生了自行開發(fā)樹形表格。 本示例提供開發(fā)思路,移除了多余的樣式,比較適合新手入...
摘要:項(xiàng)目中,組件是項(xiàng)目的基石,每個(gè)頁面都是組件來組裝起來,我司沒有自己的組件庫,選用的是組件庫,在它的基礎(chǔ)上再次封裝。部分代碼三級(jí)效果如下總結(jié)組件是項(xiàng)目的積木條,公用組件的封裝成功與否其實(shí)是對(duì)項(xiàng)目的開發(fā)效率有直接影響。 vue項(xiàng)目中,組件是項(xiàng)目的基石,每個(gè)頁面都是組件來組裝起來,我司沒有自己的組件庫,選用的是ElementUI組件庫,在它的基礎(chǔ)上再次封裝。 可編輯表格 由于是后臺(tái)管理項(xiàng)目,...
摘要:如下圖要實(shí)現(xiàn)的功能如下勾選三級(jí)聯(lián)動(dòng)的材料勾選最后一級(jí)的材料把勾選的材料信息動(dòng)態(tài)添加到下面表格中數(shù)據(jù)三級(jí)聯(lián)動(dòng)數(shù)據(jù)材料鍵值對(duì)選中的材料從后臺(tái)獲取三級(jí)聯(lián)動(dòng)數(shù)據(jù)調(diào)用封裝的函數(shù)把最后一項(xiàng)添加到函數(shù)中獲取最后一級(jí)材料函數(shù)遍歷材料樹如果有下級(jí)材料就一直 如下圖,要實(shí)現(xiàn)的功能如下,勾選三級(jí)聯(lián)動(dòng)的材料,勾選最后一級(jí)的材料,把勾選的材料信息動(dòng)態(tài)添加到下面表格中showImg(https://segment...
摘要:項(xiàng)目介紹一款基于改寫的支持樹形表格的大數(shù)據(jù)表格組件直接懟地址看看前端的小伙伴能不能給顆星呢,哈哈,歡迎提交和各種建議,討論 項(xiàng)目介紹 一款基于element-ui(2.9.1)改寫的支持樹形表格的大數(shù)據(jù)表格組件 ?? 直接懟地址 github: https://github.com/Spdino/vbt... 看看前端的小伙伴能不能給顆星呢, 哈哈,歡迎提交BUG和各種建議,討論···...
摘要:是一套基于和的表格組件。將的功能進(jìn)行了封裝,并增加了表格的增刪改查數(shù)據(jù)校驗(yàn)表格內(nèi)編輯等常用的功能。大部分功能可由配置實(shí)現(xiàn),在實(shí)現(xiàn)并擴(kuò)展了表格組件功能的同時(shí),降低了開發(fā)難度,減少了代碼量,大大簡(jiǎn)化了開發(fā)流程。 D2-Crud 是一套基于Vue.js 2.2.0+ 和 Element UI 2.0.0+ 的表格組件。D2-Crud 將 Element 的功能進(jìn)行了封裝,并增加了表格的增刪改...
閱讀 1658·2023-04-25 14:12
閱讀 1137·2021-08-27 16:24
閱讀 2571·2019-08-30 15:44
閱讀 2943·2019-08-30 13:16
閱讀 1712·2019-08-29 14:10
閱讀 1004·2019-08-29 13:54
閱讀 1338·2019-08-29 13:09
閱讀 1858·2019-08-26 18:37