element表格行列的動(dòng)態(tài)合并示例詳解
效果圖
合并行
合并列
element的table提供了合并行或者列的方法,并且有一個(gè)示例,傳送入口:element.eleme.cn/#/zh-CN/com…
但是實(shí)際應(yīng)用中,后臺(tái)數(shù)據(jù)的返回格式和指定合并肯定是動(dòng)態(tài)且沒有規(guī)律的。element的示例過于簡單,并且也沒有什么太多的解釋。實(shí)操中就碰到了這個(gè)問題?,F(xiàn)在記錄下來。
代碼詳解
實(shí)操中,需要合并的代碼通常就是子數(shù)據(jù)需要進(jìn)行合并,因?yàn)楹笈_(tái)返回的格式都是父數(shù)據(jù)中包裹著子數(shù)據(jù),這種格式看起來也是比較清晰。方便用在其他地方或者隨時(shí)更改需求(比如不需要表格),因此數(shù)據(jù)格式轉(zhuǎn)換就由前端進(jìn)行負(fù)責(zé)了。
數(shù)據(jù)結(jié)構(gòu)
后臺(tái)返回的大概就是這種結(jié)構(gòu)
originData: [ { sort: '01', children: [ { name: '01-1號(hào)' }, { name: '01-2號(hào)' } ] }, { sort: '02', children: [ { name: '02-1號(hào)' }, ] } ]
行合并
因?yàn)閑lement的table展示行的時(shí)候是遍歷數(shù)組的,data中有幾條數(shù)據(jù)就會(huì)展示出幾行,然而我們進(jìn)行行合并的時(shí)候,肯定是展示子數(shù)據(jù)的行數(shù)。因此,我們需要對(duì)原數(shù)據(jù)進(jìn)行操作,將包裹在children中的數(shù)據(jù)展開,總行數(shù)就是每個(gè)children的長度之和。
在展開數(shù)據(jù)的同時(shí),我們就可以進(jìn)行行合并的合并行數(shù)賦值操作了!
通過map展開數(shù)據(jù),在展開循環(huán)每一個(gè)children時(shí),給children里的第一個(gè)元素增加了一個(gè)代表著合并長度的字段,值為該children的長度,代表著我這一個(gè)數(shù)據(jù)該合并幾行
if(subIndex == 0){ content['rowNum'] = res.children.length }
行合并的時(shí)候,就可以直接通過判斷rowNum的數(shù)值進(jìn)行合并了,有rowNum的數(shù)值的表示需要變成rowNum行,沒有的則表示需要隱藏,賦值為0。這一部分記住,雖然合并了行,但是本身還是要占用一列的。如果忘記賦值合并多少列,就會(huì)被隱藏掉
if(columnIndex == 0){ return { rowspan: row.rowNum, // 合并行數(shù) colspan: row.rowNum>0?1:0 // 合并列數(shù) }; }
列合并
列合并的時(shí)候不需要去操作數(shù)據(jù)格式了(針對(duì)我上面寫的那種格式,具體看后臺(tái)返回的數(shù)據(jù)結(jié)構(gòu)),但是需要去知道我的表格里該有多少列,即取最多子元素的children長度,賦值為columnLength
獲得了需要多少列后,就需要進(jìn)行合并列操作了,我們要獲得幾個(gè)值:
- 總列數(shù):需要在求出的columnLength的基礎(chǔ)上增加父數(shù)據(jù)的列數(shù),我這里父數(shù)據(jù)只有sort,因此總列數(shù)需要+1,就是
columnLength+1
- 當(dāng)前列數(shù):合并的方法會(huì)返回當(dāng)前行的詳細(xì)數(shù)據(jù),同理還得+1,所以當(dāng)前列數(shù)是
row.children.length+1
- 待合并列數(shù)的列:表示我第幾列開始需要合并了,即我當(dāng)前數(shù)據(jù)最后一個(gè)有參數(shù)的值,賦值columnSort。在進(jìn)行判斷之后,等同于當(dāng)前列數(shù)為
row.children.length + 1
- 待合并列:表示我需要合并成幾列,為總列數(shù)-待合并列數(shù)的列,同時(shí)不要忘記自身占一列,需要+1,賦值columnNum,為
columnLength + 1 - columnSort + 1
上面的幾個(gè)參數(shù)獲取只要理清楚了各個(gè)數(shù)據(jù)之間的關(guān)系之后,其實(shí)并不難,就是普通的加減,但要是理不清楚,著實(shí)會(huì)暈一段時(shí)間。
console.log(`總列數(shù)${this.columnLength+1},當(dāng)前列數(shù)${row.children.length+1}`); if(row.children.length < this.columnLength){ let columnSort = row.children.length + 1 let columnNum = this.columnLength + 1 - columnSort + 1 if(columnIndex+1 == columnSort){ return{ rowspan: 1, colspan: columnNum } }else if(columnIndex+1 > columnSort ){ return [0, 0]; } console.log(`第${rowIndex+1}行,第${columnSort}列待合并${columnNum}列`); }
完整代碼+注釋
<template> <div class="order-table-contain"> <el-tabs v-model="activeName"> <el-tab-pane label="行合并" name="row"> <el-table :data="tableRowData" border :height="'530px'" style="width: 100%;" :span-method="mergeRowMethod"> <el-table-column align="center" prop="sort" label="編號(hào)"> </el-table-column> <el-table-column align="center" prop="name" label="名稱內(nèi)容"> </el-table-column> </el-table> </el-tab-pane> <el-tab-pane label="列合并" name="column"> <el-table :data="tableColumnData" border :height="'530px'" style="width: 100%;" :span-method="mergeColumnMethod"> <el-table-column align="center" prop="sort" label="編號(hào)"> </el-table-column> <el-table-column label="名稱內(nèi)容" align="center"> <el-table-column v-for="(item, index) in columnLength" :key="index" align="center" prop="name" label="名稱內(nèi)容"> <template slot-scope="scope"> <span v-if="scope.row.children[index]"> {{scope.row.children[index].name}} </span> </template> </el-table-column> </el-table-column> </el-table> </el-tab-pane> </el-tabs> </div> </template> <script> export default { data() { return { originData: [ { sort: '01', children: [ { name: '01-1號(hào)' }, { name: '01-2號(hào)' }, { name: '01-3號(hào)' }, ] }, { sort: '02', children: [ { name: '02-1號(hào)' }, ] }, { sort: '03', children: [ { name: '03-1號(hào)' }, { name: '03-2號(hào)' }, { name: '03-3號(hào)' }, { name: '03-4號(hào)' }, ] }, { sort: '04', children: [ { name: '04-1號(hào)' }, { name: '04-2號(hào)' }, ] }, { sort: '05', children: [ { name: '05-1號(hào)' }, ] } ], tableColumnData: [], tableRowData: [], activeName: 'row', columnLength: 0 }; }, watch:{ activeName: { handler(val){ if(val == 'row'){ this.loadRowData() }else{ this.loadColumnData() } }, immediate: true } }, methods: { loadRowData(){ this.tableRowData = [] let originArr = JSON.parse(JSON.stringify(this.originData)) // 普通的數(shù)據(jù)轉(zhuǎn)換,將后臺(tái)格式轉(zhuǎn)換成element表格需要的格式 if(Array.isArray(originArr)){ originArr.map(res=>{ if(Array.isArray(res.children)){ res.children.map((subRes, subIndex)=>{ let content = {} content = subRes content['sort'] = res.sort // 重點(diǎn)!賦值合并的行數(shù)數(shù)值,只需要取子循環(huán)的第一個(gè)數(shù)賦值待合并的行數(shù)即可 if(subIndex == 0){ content['rowNum'] = res.children.length } this.tableRowData.push(content) }) } }) } }, loadColumnData(){ this.tableColumnData = JSON.parse(JSON.stringify(this.originData)) if(Array.isArray(this.tableColumnData)){ this.tableColumnData.map((res, index)=>{ if(Array.isArray(res.children)){ // 獲取最大列數(shù)為element的列數(shù) if(index == 0){ this.columnLength = res.children.length } else{ if(res.children.length > this.columnLength){ this.columnLength = res.children.length } } } }) } }, // 合并行 mergeRowMethod({ row, column, rowIndex, columnIndex }){ // columnIndex 代表列數(shù),從0開始計(jì)數(shù),我們要合并的字段屬于第一列,取0 if(columnIndex == 0){ return { rowspan: row.rowNum, // 待合并行數(shù) -- 合并的行數(shù)長度就等于之前賦值的子數(shù)據(jù)的長度;未賦值的即表示0,不顯示 colspan: row.rowNum>0?1:0 // 待合并列數(shù) -- 合并的列數(shù)自身占一列,被合并的要返回0,表示不顯示 }; } }, // 合并列 mergeColumnMethod({ row, column, rowIndex, columnIndex }){ console.log(`總列數(shù)${this.columnLength+1},當(dāng)前列數(shù)${row.children.length+1}`); // 列數(shù)記得加上父的列數(shù) // 當(dāng)數(shù)據(jù)列數(shù)小于表格列數(shù),需合并 if(row.children.length < this.columnLength){ let columnSort = row.children.length + 1 // 待合并列序號(hào),表示第幾列待合并 -- 數(shù)據(jù)返回的有數(shù)據(jù)的最后一列,加上第一列 let columnNum = this.columnLength + 1 - columnSort + 1 // 待合并的列數(shù)需要合并幾列 -- 從0開始計(jì)數(shù),并且要加上自身的列數(shù),需+2 if(columnIndex+1 == columnSort){ return{ rowspan: 1, colspan: columnNum } }else if(columnIndex+1 > columnSort ){ return [0, 0]; // 合并的兩種寫法,被合并的需要賦值0隱藏 } console.log(`第${rowIndex+1}行,第${columnSort}列待合并${columnNum}列`); } } } }; </script> <style lang="less"> .order-table-contain{ padding: 20px; padding-top: 5px; box-sizing: border-box; // 設(shè)置表頭樣式 .el-table__header-wrapper{ .el-table__header{ .is-group{ tr:nth-child(2){ display: none; } } } } } </style>
以上就是element表格行列的動(dòng)態(tài)合并示例詳解的詳細(xì)內(nèi)容,更多關(guān)于element表格行列動(dòng)態(tài)合并的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- element el-table如何實(shí)現(xiàn)表格動(dòng)態(tài)增加/刪除/編輯表格行(帶校驗(yàn)規(guī)則)
- Vue+ElementUI踩坑之動(dòng)態(tài)顯示/隱藏表格的列el-table-column問題
- element-ui復(fù)雜table表格動(dòng)態(tài)新增列、動(dòng)態(tài)調(diào)整行以及列順序詳解
- vue element-ui表格自定義動(dòng)態(tài)列具體實(shí)現(xiàn)
- el-element中el-table表格嵌套el-select實(shí)現(xiàn)動(dòng)態(tài)選擇對(duì)應(yīng)值功能
- vue?element-ui動(dòng)態(tài)橫向統(tǒng)計(jì)表格的實(shí)現(xiàn)
- element 動(dòng)態(tài)合并表格的步驟
- Vue+elementui 實(shí)現(xiàn)復(fù)雜表頭和動(dòng)態(tài)增加列的二維表格功能
- element根據(jù)輸入動(dòng)態(tài)生成表格的示例代碼
相關(guān)文章
vue 實(shí)現(xiàn)邊輸入邊搜索功能的實(shí)例講解
今天小編就為大家分享一篇vue 實(shí)現(xiàn)邊輸入邊搜索功能的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09element使用自定義icon圖標(biāo)的兩種解決方式
因?yàn)榘惭b原型圖設(shè)計(jì)實(shí)現(xiàn)頁面,在element自帶的圖標(biāo)庫好像沒有,所以按鈕的圖標(biāo)icon需要自定義,下面這篇文章主要給大家介紹了關(guān)于element使用自定義icon圖標(biāo)的兩種解決方式,需要的朋友可以參考下2022-07-07Vue監(jiān)聽某個(gè)元素以外的區(qū)域被點(diǎn)擊問題
這篇文章主要介紹了Vue監(jiān)聽某個(gè)元素以外的區(qū)域被點(diǎn)擊問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10vue3使用element-plus再次封裝table組件的基本步驟
這篇文章主要介紹了vue3使用element-plus再次封裝table組件的基本步驟,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-03-03使用Webpack提升Vue.js應(yīng)用程序的4種方法(翻譯)
這篇文章主要介紹了使用Webpack提升Vue.js應(yīng)用程序的4種方法(翻譯),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10實(shí)例詳解vue.js淺度監(jiān)聽和深度監(jiān)聽及watch用法
這篇文章主要介紹了vue.js淺度監(jiān)聽和深度監(jiān)聽及watch用法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2018-08-08