詳解Vue.js iview實(shí)現(xiàn)樹(shù)形權(quán)限表(可擴(kuò)展表)
問(wèn)題:
需要一個(gè)可折疊的權(quán)限管理系統(tǒng),用表格展示。
主要用的iView組件庫(kù),有Table(表格),Tree(樹(shù)形控件),Collapse(折疊面板)看起來(lái)比較符合意思
深入查看Table相關(guān)范例,發(fā)現(xiàn)有個(gè) 通過(guò)給 columns 數(shù)據(jù)設(shè)置一項(xiàng),指定 type: 'expand',即可開(kāi)啟擴(kuò)展功能 可以考慮
但也只是展開(kāi)詳細(xì)內(nèi)容,如需樹(shù)形結(jié)構(gòu),則需要render自定義去渲染,挺麻煩的。再去看看element UI,也沒(méi)有什么比較好的選擇。
過(guò)程:
第一步,先構(gòu)建根節(jié)點(diǎn)的數(shù)據(jù)表,后臺(tái)返回JSON數(shù)據(jù)解析(www.json.cn)基本如下

前面2個(gè)object和第三個(gè)結(jié)構(gòu)基本類似,將數(shù)據(jù)注入authlist,匹配listcolumns展示


展示結(jié)果如下:
第二步,添加Columns的擴(kuò)展expand功能,在listcolumns里添加
listcolumns: [{
title: '序號(hào)',
key: '_index',
className: 'index_css',
render: (h, params) = >{
return h('div', [h('span', {
style: {
display: 'inline-block',
width: '100%',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
textAlign: 'center'
}
},
params.row._index)]);
}
},
{
//添加的expand
type: 'expand',
width: 20,
render: (h, params) = >{
return h(expandRow, {
style: {
padding: 0
},
props: {
row: params.row
}
})
}
},
{
title: '權(quán)限名稱',
key: 'Title',
className: 'Title_css',
ellipsis: true,
render: (h, params) = >{
return h('div', [h('span', {
style: {
display: 'inline-block',
width: '100%',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap'
}
},
params.row.Title)]);
}
},
展示效果:

第三步:authtable_expand.vue子組件,基本和父組件的Table一致
< template >
<Table stripe: loading = "loading": showHeader = false border: columns = "listcolumns": data = "listauth"style = "overflow-y: hidden;max-height: 522px;" > </Table>
</template >
<script >
import expandRow from '../components/authtable_expand.vue';
export
default {
props: ['row'],
data() {
return {
loading: false,
listcolumns: [
//listcolumns暫不展示
],
listauth: []
}
},
mounted() {},
methods: {},
created() {
//console.log("authotable_expend created: " + JSON.stringify(this.row.children))
var object = this.row.children;
console.log("auth expand data:" + JSON.stringify(object)) this.listauth.splice(0) object.forEach(r = >{
this.listauth.push(r)
})
//console.log("listauth:" + JSON.stringify(this.listauth))
}
}
< /script>
<style lang="less">
td.ivu-table-expanded-cell{
padding:0;
}
</style >
注意,添加td.ivu-table-expanded-cell{padding:0;},可以是擴(kuò)展部分內(nèi)容充滿全部,展示效果如下

在expand.vue里遞歸調(diào)用自身,可以逐級(jí)擴(kuò)展
總結(jié):
目前在Vue.js的2個(gè)主要的前端組件iView和ElementUI都暫時(shí)沒(méi)有看到合適的可擴(kuò)展的樹(shù)形表,只有自己編寫(xiě)相關(guān)組件來(lái)實(shí)現(xiàn)。相信以后應(yīng)該都會(huì)有的,就像之前iView多表頭都沒(méi)有,后面也終于添加了。
此外,自定義組合樹(shù)形權(quán)限表還有部分功能沒(méi)有完善,如:
1如果當(dāng)前節(jié)點(diǎn)沒(méi)有子節(jié)點(diǎn),就不應(yīng)該出現(xiàn)擴(kuò)展的按鈕
2擴(kuò)展按鈕最好按照樹(shù)的深度逐漸向后移動(dòng)
3序號(hào)未按總序號(hào)排列
預(yù)期結(jié)果應(yīng)該類似于:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用typescript構(gòu)建Vue應(yīng)用的實(shí)現(xiàn)
這篇文章主要介紹了使用typescript構(gòu)建Vue應(yīng)用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
vue?router如何實(shí)現(xiàn)tab切換
這篇文章主要介紹了vue?router如何實(shí)現(xiàn)tab切換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
vue項(xiàng)目實(shí)現(xiàn)github在線預(yù)覽功能
這篇文章主要介紹了vue項(xiàng)目實(shí)現(xiàn)github在線預(yù)覽功能,本文通過(guò)提問(wèn)兩個(gè)問(wèn)題帶領(lǐng)大家一起學(xué)習(xí)整個(gè)過(guò)程,需要的朋友可以參考下2018-06-06
Vue如何通過(guò)瀏覽器控制臺(tái)查看全局data值
在寫(xiě)vue項(xiàng)目時(shí)想到一個(gè)問(wèn)題,項(xiàng)目里面的文件都是一個(gè)個(gè)的組件,如何在控制臺(tái)中修改,查看組件data里的值呢,下面這篇文章主要給大家介紹了關(guān)于Vue如何通過(guò)瀏覽器控制臺(tái)查看全局data值的相關(guān)資料,需要的朋友可以參考下2023-04-04

