日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

el-table表格動態合并相同數據單元格(可指定列+自定義合并)

瀏覽:29日期:2022-06-12 14:16:14
目錄1.固定合并2. 動態合并相同數據單元格(所有列)3. 動態合并相同數據單元格(指定列)4. 動態合并相同數據單元格(指定列+合并條件)完整代碼1.固定合并官方挺提供的合并具體某行列的方法:el-table合并行或列通過給table傳入span-method方法可以實現合并行或列,方法的參數是一個對象,里面包含當前行row、當前列column、當前行號rowIndex、當前列號columnIndex四個屬性。

該函數可以返回一個包含兩個元素的數組,第一個元素代表rowspan,第二個元素代表colspan。 也可以返回一個鍵名為rowspan和colspan的對象。

<template> <div> <el-table :data='tableData' :span-method='arraySpanMethod' border style='width: 100%'> <el-table-columnprop='id'label='ID'width='180'> </el-table-column> <el-table-columnprop='name'label='姓名'> </el-table-column> <el-table-columnprop='amount1'sortablelabel='數值 1'> </el-table-column> <el-table-columnprop='amount2'sortablelabel='數值 2'> </el-table-column> <el-table-columnprop='amount3'sortablelabel='數值 3'> </el-table-column> </el-table> <el-table :data='tableData' :span-method='objectSpanMethod' border style='width: 100%; margin-top: 20px'> <el-table-columnprop='id'label='ID'width='180'> </el-table-column> <el-table-columnprop='name'label='姓名'> </el-table-column> <el-table-columnprop='amount1'label='數值 1(元)'> </el-table-column> <el-table-columnprop='amount2'label='數值 2(元)'> </el-table-column> <el-table-columnprop='amount3'label='數值 3(元)'> </el-table-column> </el-table> </div></template><script> export default { data() { return {tableData: [{ id: '12987122', name: '王小虎', amount1: '234', amount2: '3.2', amount3: 10}, { id: '12987123', name: '王小虎', amount1: '165', amount2: '4.43', amount3: 12}, { id: '12987124', name: '王小虎', amount1: '324', amount2: '1.9', amount3: 9}, { id: '12987125', name: '王小虎', amount1: '621', amount2: '2.2', amount3: 17}, { id: '12987126', name: '王小虎', amount1: '539', amount2: '4.1', amount3: 15}] }; }, methods: { arraySpanMethod({ row, column, rowIndex, columnIndex }) {if (rowIndex % 2 === 0) { if (columnIndex === 0) { return [1, 2]; } else if (columnIndex === 1) { return [0, 0]; }} }, objectSpanMethod({ row, column, rowIndex, columnIndex }) {if (columnIndex === 0) { if (rowIndex % 2 === 0) { return { rowspan: 2, colspan: 1 }; } else { return { rowspan: 0, colspan: 0 }; }} } } };</script>

運行效果:

缺點:這種只適合寫死的數據和固定的表格行列,無法動態判斷單元格數據是否相等再合并;

2. 動態合并相同數據單元格(所有列)可以對所有相同數據的列,進行動態合并此方法適合需要合并所有的相同數據的單元格<template> <div> <el-table :data='tableData' :span-method='objectSpanMethod' border :header-cell-style='{ textAlign: 'center', backgroundColor: '#F5F7FA' }' > <el-table-column prop='School' label='學校' align='center'> </el-table-column> <el-table-column prop='Grade' label='年級' /> <el-table-column prop='Class' label='班級' /> <el-table-column prop='Name' label='姓名' /> <el-table-column prop='Chinese' label='語文' /> <el-table-column prop='Math' label='數學' /> <el-table-column prop='English' label='英語' /> </el-table> </div></template><script>export default { data() { return { // 存放所有的表頭 一定要與tableData一致 colFields: ['School','Grade','Class','Name','Chinese','Math','English', ], spanArr: [], //存儲合并單元格的開始位置 // 表格數據 tableData: [// 一年級{ School: '第一小學', Grade: '1年級', Class: '1班', Name: '張三', Chinese: '90', Math: '100', English: '80',},{ School: '第一小學', Grade: '1年級', Class: '2班', Name: '李四', Chinese: '90', Math: '85', English: '80',},{ School: '第一小學', Grade: '1年級', Class: '3班', Name: '王五', Chinese: '79', Math: '100', English: '80',},// 二年級{ School: '第一小學', Grade: '2年級', Class: '1班', Name: '趙六', Chinese: '95', Math: '100', English: '80',},{ School: '第一小學', Grade: '2年級', Class: '2班', Name: '錢八', Chinese: '98', Math: '85', English: '80',},{ School: '第一小學', Grade: '2年級', Class: '3班', Name: '陳九', Chinese: '79', Math: '100', English: '80',},// 三年級{ School: '第一小學', Grade: '3年級', Class: '1班', Name: '黃十', Chinese: '91', Math: '88', English: '80',},{ School: '第一小學', Grade: '3年級', Class: '2班', Name: '魏一', Chinese: '90', Math: '86', English: '87',},{ School: '第一小學', Grade: '3年級', Class: '3班', Name: '楊二', Chinese: '79', Math: '99', English: '80',}, ], }; }, methods: { /** * 分析每一列,找出相同的 * @param data */ getSpanArr() { for (let i = 0; i < this.tableData.length; i++) {let row = i;// let col = i % this.colCount;if (row === 0) { // i 表示行 j表示列 for (let j = 0; j < this.colFields.length; j++) { this.spanArr[i * this.colFields.length + j] = { rowspan: 1, colspan: 1, }; }} else { for (let j = 0; j < this.colFields.length; j++) { // 當前和上一次的一樣 // 1. 合并所有列的相同數據單元格 if ( this.tableData[row][this.colFields[j]] === this.tableData[row - 1][this.colFields[j]] ) { let beforeItem =this.spanArr[(row - 1) * this.colFields.length + j]; this.spanArr[row * this.colFields.length + j] = {rowspan: 1 + beforeItem.rowspan, // 合并幾行colspan: 1, // 合并幾列,我這里只是跨行合并,不跨列合并,所以用的1 }; beforeItem.rowspan = 0; beforeItem.colspan = 0; } else { // rowspan 和 colspan 都為1表格此單元格不合并 this.spanArr[row * this.colFields.length + j] = {rowspan: 1,colspan: 1, }; } }} } // 對數據進行倒序 let stack = []; for (let i = 0; i < this.colFields.length; i++) {for (let j = 0; j < this.tableData.length; j++) { // console.log('i=' + i + ' j=' + j); // i 表示列 j表示行 if (j === 0) { if (this.spanArr[j * this.colFields.length + i].rowspan === 0) { stack.push(this.spanArr[j * this.colFields.length + i]); } } else { if (this.spanArr[j * this.colFields.length + i].rowspan === 0) { stack.push(this.spanArr[j * this.colFields.length + i]); } else { stack.push(this.spanArr[j * this.colFields.length + i]); while (stack.length > 0) {let pop = stack.pop();let len = stack.length;this.spanArr[(j - len) * this.colFields.length + i] = pop; } } }} } // console.log(this.spanArr); }, objectSpanMethod({ row, column, rowIndex, columnIndex }) { // console.log(this.spanArr[rowIndex * this.colFields.length + columnIndex]); return this.spanArr[rowIndex * this.colFields.length + columnIndex]; }, }, mounted() { this.getSpanArr(); },};</script><style lang='scss' scoped></style>

效果:

我們可以看到,所有列,只要數據相同的單元格都被合并了,包括我不想合并的單元格,這時候就要指定合并的列了

3. 動態合并相同數據單元格(指定列)

只需要加個if判斷即可指定要合并哪些列

// 這里只放了部分代碼,除了加了個if,其他代碼和上面的一樣 getSpanArr() { for (let i = 0; i < this.tableData.length; i++) {let row = i;// let col = i % this.colCount;if (row === 0) { // i 表示行 j表示列 for (let j = 0; j < this.colFields.length; j++) { this.spanArr[i * this.colFields.length + j] = { rowspan: 1, colspan: 1, }; }} else { for (let j = 0; j < this.colFields.length; j++) { // 當前和上一次的一樣 // 合并所有列的相同數據單元格 if ( this.colFields[j] == 'School' || this.colFields[j] == 'Grade' || this.colFields[j] == 'Class' ) { // 指定合并哪些列 if (this.tableData[row][this.colFields[j]] ===this.tableData[row - 1][this.colFields[j]] ) {let beforeItem = this.spanArr[(row - 1) * this.colFields.length + j];this.spanArr[row * this.colFields.length + j] = { rowspan: 1 + beforeItem.rowspan, colspan: 1,};beforeItem.rowspan = 0;beforeItem.colspan = 0; } else {// rowspan 和 colspan 都為1表格此單元格不合并this.spanArr[row * this.colFields.length + j] = { rowspan: 1, colspan: 1,}; } } }} }

效果:這樣就只合并了我們指定的那幾列了

4. 動態合并相同數據單元格(指定列+合并條件)

有時候我們會遇到不想合并的單元格,比如下面這種情況:

按常理來說,不同小學的數據應該是不做合并才對,正確是這種:

這時候就需要加上一些自定義的合并條件了:

getSpanArr() { for (let i = 0; i < this.tableData.length; i++) {let row = i;// let col = i % this.colCount;if (row === 0) { // i 表示行 j表示列 for (let j = 0; j < this.colFields.length; j++) { this.spanArr[i * this.colFields.length + j] = { rowspan: 1, colspan: 1, }; }} else { for (let j = 0; j < this.colFields.length; j++) { // 當前和上一次的一樣 // 合并所有列的相同數據單元格 if ( this.colFields[j] == 'School' || this.colFields[j] == 'Grade' || this.colFields[j] == 'Class' ) { // 指定合并哪些列 if (this.tableData[row]['School'] !== this.tableData[row - 1]['School'] ) { // 哪些不合并:School不一樣的,不合并this.spanArr[row * this.colFields.length + j] = { rowspan: 1, colspan: 1,}; } else if (this.tableData[row][this.colFields[j]] ===this.tableData[row - 1][this.colFields[j]] ) {let beforeItem = this.spanArr[(row - 1) * this.colFields.length + j];this.spanArr[row * this.colFields.length + j] = { rowspan: 1 + beforeItem.rowspan,// 合并幾列 colspan: 1,// 合并幾行};beforeItem.rowspan = 0;beforeItem.colspan = 0; } else {// rowspan 和 colspan 都為1表格此單元格不合并this.spanArr[row * this.colFields.length + j] = { rowspan: 1, colspan: 1,}; } } }} } // console.log(this.spanArr); },

這時候再看,就是我們想要的效果了

完整代碼

最后附完整代碼:

<template> <div> <el-table :data='tableData' :span-method='objectSpanMethod' border :header-cell-style='{ textAlign: 'center', backgroundColor: '#F5F7FA' }' > <el-table-column prop='School' label='學校' align='center'> </el-table-column> <el-table-column prop='Grade' label='年級' /> <el-table-column prop='Class' label='班級' /> <el-table-column prop='Name' label='姓名' /> <el-table-column prop='Chinese' label='語文' /> <el-table-column prop='Math' label='數學' /> <el-table-column prop='English' label='英語' /> </el-table> </div></template><script>export default { data() { return { // 存放所有的表頭 一定要與tableData一致 colFields: ['School','Grade','Class','Name','Chinese','Math','English', ], spanArr: [], //存儲合并單元格的開始位置 // 表格數據 tableData: [// 一年級{ School: '第一小學', Grade: '1年級', Class: '1班', Name: '張三', Chinese: '90', Math: '100', English: '80',},{ School: '第一小學', Grade: '1年級', Class: '1班', Name: '張偉', Chinese: '90', Math: '99', English: '89',},{ School: '第一小學', Grade: '1年級', Class: '2班', Name: '李四', Chinese: '90', Math: '85', English: '80',},{ School: '第一小學', Grade: '1年級', Class: '3班', Name: '王五', Chinese: '79', Math: '100', English: '80',},// 二年級{ School: '第一小學', Grade: '2年級', Class: '1班', Name: '趙六', Chinese: '95', Math: '100', English: '80',},{ School: '第一小學', Grade: '2年級', Class: '2班', Name: '錢八', Chinese: '98', Math: '85', English: '80',},{ School: '第一小學', Grade: '2年級', Class: '3班', Name: '陳九', Chinese: '79', Math: '100', English: '100',},// 三年級{ School: '第一小學', Grade: '3年級', Class: '1班', Name: '黃十', Chinese: '91', Math: '88', English: '80',},{ School: '第一小學', Grade: '3年級', Class: '2班', Name: '魏一', Chinese: '90', Math: '86', English: '87',},{ School: '第一小學', Grade: '3年級', Class: '3班', Name: '楊二', Chinese: '79', Math: '99', English: '80',},// 第二小學{ School: '第二小學', Grade: '3年級', Class: '3班', Name: '袁零', Chinese: '79', Math: '99', English: '80',}, ], }; }, methods: { /** * 分析每一列,找出相同的 * @param data */ getSpanArr() { for (let i = 0; i < this.tableData.length; i++) {let row = i;// let col = i % this.colCount;if (row === 0) { // i 表示行 j表示列 for (let j = 0; j < this.colFields.length; j++) { this.spanArr[i * this.colFields.length + j] = { rowspan: 1, colspan: 1, }; }} else { for (let j = 0; j < this.colFields.length; j++) { // 當前和上一次的一樣 // 合并所有列的相同數據單元格 if ( this.colFields[j] == 'School' || this.colFields[j] == 'Grade' || this.colFields[j] == 'Class' ) { // 指定合并哪些列 if (this.tableData[row]['School'] !== this.tableData[row - 1]['School'] ) { // 哪些不合并:School不一樣的,不合并this.spanArr[row * this.colFields.length + j] = { rowspan: 1, colspan: 1,}; } else if (this.tableData[row][this.colFields[j]] ===this.tableData[row - 1][this.colFields[j]] ) {let beforeItem = this.spanArr[(row - 1) * this.colFields.length + j];this.spanArr[row * this.colFields.length + j] = { rowspan: 1 + beforeItem.rowspan,// 合并幾列 colspan: 1,// 合并幾行};beforeItem.rowspan = 0;beforeItem.colspan = 0; } else {// rowspan 和 colspan 都為1表格此單元格不合并this.spanArr[row * this.colFields.length + j] = { rowspan: 1, colspan: 1,}; } } }} } // 對數據進行倒序 let stack = []; for (let i = 0; i < this.colFields.length; i++) {for (let j = 0; j < this.tableData.length; j++) { // console.log('i=' + i + ' j=' + j); // i 表示列 j表示行 if (j === 0) { if (this.spanArr[j * this.colFields.length + i].rowspan === 0) { stack.push(this.spanArr[j * this.colFields.length + i]); } } else { if (this.spanArr[j * this.colFields.length + i].rowspan === 0) { stack.push(this.spanArr[j * this.colFields.length + i]); } else { stack.push(this.spanArr[j * this.colFields.length + i]); while (stack.length > 0) {let pop = stack.pop();let len = stack.length;this.spanArr[(j - len) * this.colFields.length + i] = pop; } } }} } // console.log(this.spanArr); }, objectSpanMethod({ row, column, rowIndex, columnIndex }) { // console.log(this.spanArr[rowIndex * this.colFields.length + columnIndex]); return this.spanArr[rowIndex * this.colFields.length + columnIndex]; }, }, mounted() { this.getSpanArr(); },};</script><style lang='scss' scoped></style>

參考:https://blog.csdn.net/u010735120/article/details/122184493

到此這篇關于el-table表格動態合并相同數據單元格(可指定列+自定義合并)的文章就介紹到這了,更多相關el-table 動態合并單元格內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
在线看片日韩| 乱人伦精品视频在线观看| 欧美日韩精品一本二本三本| 日韩国产在线观看| 岛国av在线网站| 亚洲欧美日韩一区在线观看| 青草国产精品| 精品午夜av| 欧美日韩国产一区二区三区不卡| 国产精品对白| 美女视频黄免费的久久| 欧美 日韩 国产精品免费观看| 国产 日韩 欧美 综合 一区| 国产精品多人| 日韩高清欧美激情| 亚洲理论在线| 影院欧美亚洲| 国产成人a视频高清在线观看| 国产亚洲精品精品国产亚洲综合| 在线亚洲激情| 亚洲视频二区| 国产精品美女久久久浪潮软件| 日韩在线第七页| 国产欧美自拍| 免费精品视频在线| 久久国产精品色av免费看| 国产精品毛片久久久| 蜜桃视频免费观看一区| 一区二区三区四区在线观看国产日韩| 亚洲高清av| 亚洲激情偷拍| 亚洲一区二区三区久久久| 午夜欧美在线| 在线观看亚洲精品福利片| 丝袜美腿成人在线| 日韩专区一卡二卡| 亚洲免费高清| 影音先锋久久精品| 国产精品外国| 国产精品a级| 国产精品亚洲成在人线| 青青青国产精品| 亚洲激情社区| 蜜臀国产一区| 日本午夜精品久久久久| 狠狠色综合网| 爽好多水快深点欧美视频| 日本一二区不卡| 精品三级在线观看视频| 亚洲欧美日本视频在线观看| 亚欧洲精品视频在线观看| 亚洲一区成人| 日韩和的一区二在线| 一区二区国产在线| 欧美日韩尤物久久| 91福利精品在线观看| 欧美日韩一二三四| 日本中文字幕不卡| 日韩av一级| 视频一区视频二区中文字幕| 日韩在线网址| 国产精品一站二站| 成人欧美一区二区三区的电影| 尹人成人综合网| 日韩一区二区三区免费视频| 久久精品网址| 日韩a一区二区| 欧美日韩精品在线一区| 久久精品五月| 日韩欧美不卡| 国产精品亲子伦av一区二区三区| 风间由美中文字幕在线看视频国产欧美| 国内精品麻豆美女在线播放视频| 日本一区中文字幕| 欧美午夜不卡| 狠狠爱www人成狠狠爱综合网| 精品一区二区三区四区五区| 日韩一级不卡| 欧美日韩免费看片| 精品91福利视频| 国产欧美91| 亚洲在线观看| 国产在线日韩| 欧美久久久网站| 亚洲国产成人二区| 亚洲视频国产| 色偷偷偷在线视频播放| 成人在线网站| 日本久久成人网| 不卡在线一区| 在线日韩欧美| 欧美在线影院| 激情丁香综合| 91久久中文| 久久精品国产大片免费观看| 精品视频一二| 久久中文字幕一区二区三区| 一区福利视频| 欧美成a人免费观看久久| 精品中国亚洲| 免费在线播放第一区高清av| 丝袜脚交一区二区| 三级在线看中文字幕完整版| 欧美黄色一区| 亚洲不卡视频| 视频一区日韩精品| 蜜臀久久久99精品久久久久久| 亚洲网站视频| 三级一区在线视频先锋| 美国欧美日韩国产在线播放| 午夜亚洲福利| 国产精品手机在线播放| 国产精品欧美一区二区三区不卡| 影视先锋久久| аⅴ资源天堂资源库在线| 日本亚洲视频| 日韩一区亚洲二区| 三级在线观看一区二区| 国产调教精品| 日本久久成人网| 日本精品另类| 国产精品亚洲片在线播放| 久久不卡国产精品一区二区| 麻豆久久久久久久| 神马午夜在线视频| 欧美日韩国产综合网| 首页亚洲欧美制服丝腿| 日韩一二三区在线观看| 麻豆成人在线观看| 久久aⅴ国产紧身牛仔裤| 国产视频一区欧美| 亚洲电影在线| 亚洲人成在线网站| 国产中文字幕一区二区三区| 欧美天堂一区二区| 日本99精品| 日韩不卡手机在线v区| 久久国产日韩| 97精品国产| 国产欧美日韩一区二区三区四区| 日本一区二区免费高清| 日韩一区二区免费看| 久久精品国产久精国产爱| 久久黄色影院| 欧美91在线| 蜜桃久久久久久| 97成人在线| 精品淫伦v久久水蜜桃| 岛国av在线网站| 亚洲精品观看| 视频一区中文| 亚洲伊人av| 国内精品伊人| 欧美日韩一区二区三区不卡视频| 亚洲女同一区| av中文字幕在线观看第一页| 精品国产一区二| 中文字幕系列一区| 精品国产一区二区三区av片| 国产精品日本一区二区三区在线| 久久精品系列| 久久av一区二区三区| 欧美中文一区| 亚洲性色av| 国产伦精品一区二区三区千人斩| 亚洲www免费| 国产欧美日韩精品高清二区综合区 | 美女少妇全过程你懂的久久| 亚州欧美在线| 97视频热人人精品免费| 亚洲精品免费观看| 韩国精品主播一区二区在线观看| 视频精品一区二区| 日韩高清中文字幕一区二区| 日韩精品五月天| 91超碰国产精品| 电影91久久久| 麻豆久久久久久| 亚洲欧洲专区| 免费观看久久久4p| 婷婷综合激情| 久久高清免费| 日韩欧美1区| 久久五月天小说| 国产精品社区| 久久久久91| 欧美一区=区| 青青草国产成人99久久| 免费在线成人| 国产日韩精品视频一区二区三区| 国产精品香蕉| 日韩天堂在线| 亚洲精品成a人ⅴ香蕉片| 久久久天天操| 青草国产精品久久久久久| 日韩高清不卡一区| 久久国产三级精品| 欧美激情一区| 麻豆视频在线看| 久久福利在线|