vue3 elementplus table合并寫法
vue3 elementplus table合并寫法

table表格下方合并寫法:
1:?jiǎn)涡泻喜?/p>
(1)在標(biāo)簽中加入屬性
:summary-method="getSummaries"
:show-summary="true" <el-table
:data="data"
id="tableRef"
ref="tableRef"
row-key="belnr"
class="td-bacg-white"
:summary-method="getSummaries"
:show-summary="true"
>
<template v-for="(item1, index1) in tableColumns">
<template v-if="item1.children">
<el-table-column
:key="index1"
:label="item1.title"
align="center"
>
<template v-for="item in item1.children">
<el-table-column
v-if="!item.hidden"
:align="item.align || 'center'"
:prop="item.dataIndex"
:label="item.title"
:min-width="item.width"
:key="item.dataIndex"
:show-overflow-tooltip="
item.overflow === false ? false : true
"
>
<template #default="scope">
<template >
<el-table-column
:align="item1.align || 'center'"
:key="index1"
:prop="item1.dataIndex"
:label="item1.title"
:fixed="item1.fixed || false"
:min-width="item1.width"
show-overflow-tooltip
>
<template #default="scope">
<span
v-if="item1.filterType === 'toThousandFilter'"
>
{{
toThousandFilter(
Number(scope.row[`${item1.dataIndex}`] || 0)
)
}}
</span>
<span v-else-if="item1.dataIndex === 'ii'">
<span>{{ scope.row[`${item1.dataIndex}`] }}%</span>
</span>
<span v-else>
<span>{{ scope.row[`${item1.dataIndex}`] }}</span>
</span>
</template>
</el-table-column>
</template>
</template>
</el-table>(2)合并方法
下方判斷字段為 uu ii 的兩個(gè)字段計(jì)算合并。
/**
* 合計(jì)
*/
interface SummaryMethodProps<T = SpmxListType> {
columns: TableColumnCtx<T>[];
data: T[];
}
function getSummaries(param: SummaryMethodProps) {
const { columns, data } = param;
const sums: string[] = [];
columns.forEach((column, index) => {
if (index === 1) {
sums[index] = '合計(jì)';
return;
}
if (
column.property !== 'uu' &&
column.property !== 'ii'
) {
sums[index] = '';
return;
}
const values = data.map(item => Number(item[column.property]));
console.log(columns, '==columns');
if (!values.every(value => isNaN(value))) {
sums[index] = values
.reduce((prev, curr) => {
const value = Number(curr);
if (!isNaN(value)) {
return prev + curr;
} else {
return prev;
}
}, 0)
.toString();
sums[index] = Number(sums[index]).toFixed(2);
if (
column.property === 'ii'
) {
// 加百分號(hào)
sums[index] = sums[index]+'%';
}else{
// 加千葉符
sums[index] = toThousandFilter(Number(sums[index]));
}
} else {
sums[index] = '';
}
});
console.log(sums);
return sums;
}2.如果下方合并是兩行的,用到Render函數(shù)
(利用render函數(shù)插入2個(gè)div作為2行展示)
function getSummaries(param: SummaryMethodProps) {
const { columns, data } = param;
const sums: string[] = [];
columns.forEach((column, index) => {
if (index === 0) {
// sums[index] = '小計(jì) total';
sums[index] = h('div', {class: ''},[
h("div", '小計(jì) total', ),
h("div", '% of total', ),
]);
// sums[index] = <div>
// <div>合計(jì)</div>
// <div> 備注</div>
// </div>;
return;
}
if (index === 1) {
// sums[index] = '小計(jì) total';
sums[index] = h('div', {class: ''},[
h("div", '1234567', ),
h("br", '', ),
]);
return;
} if (index === 2) {
// sums[index] = '小計(jì) total';
sums[index] = h('div', {class: ''},[
h("div", '100%', ),
h("div", '12%', ),
]);
return;
}
if (index === 3) {
// sums[index] = '小計(jì) total';
sums[index] = h('div', {class: ''},[
h("div", '1234567', ),
h("br", '', ),
]);
return;
}
if (index === 4) {
// sums[index] = '小計(jì) total';
sums[index] = h('div', {class: ''},[
h("div", '100%', ),
h("div", '88%', ),
]);
return;
}
if (
column.property !== 'ee' &&
column.property !== 'rr'
) {
sums[index] = '';
return;
}
});
console.log(sums);
return sums;
}Vue3+ElementPlus實(shí)現(xiàn)Table表格的行合并(單個(gè)及多個(gè))
實(shí)現(xiàn)結(jié)果

<el-table
border
v-loading="state.loading"
:data="state.tableDataList"
:height="pagTabHeight"
row-key="id"
ref="tableRef"
:highlight-current-row="true"
@row-click="rowClick"
:span-method="objectSpanMethod"
>
<el-table-column type="index" label="序號(hào)" align="center" />
<el-table-column
prop="level"
label="參數(shù)級(jí)別"
show-overflow-tooltip
align="center"
/>
<el-table-column
prop="year"
label="年度"
show-overflow-tooltip
align="center"
/>
<el-table-column
prop="type"
label="評(píng)價(jià)類型"
show-overflow-tooltip
align="center"
/>
<el-table-column
prop="way"
label="定額方式"
show-overflow-tooltip
align="center"
/>
<el-table-column
prop="creator"
label="創(chuàng)建人"
show-overflow-tooltip
align="center"
/>
<el-table-column label="創(chuàng)建時(shí)間" show-overflow-tooltip align="center">
<template #default="{ row }">{{
dateFormat(row.createTime, 'yyyy-MM-dd')
}}</template>
</el-table-column>
</el-table>實(shí)現(xiàn)方法
interface ObjInterface {
[key: string]: any; // 字段擴(kuò)展聲明
}
/**
* @description 合并表格行
* @export
* @param {object[]} data 表格數(shù)據(jù)
* @param {string} rowName 合并行的name
* @param {string} otherRowName 合并其他行
* @return {*}
*/
export function tableRowMerge(
data: ObjInterface[],
rowName: string,
otherRowName?: string
) {
const idArray = [] as number[];
let idPos = 0;
for (let i = 0; i < data.length; i++) {
// 如果當(dāng) i == 0 說(shuō)明數(shù)據(jù)是第一行, 需要重新賦值
if (i == 0) {
// idArray.push(1) 說(shuō)明這一行數(shù)據(jù)被顯示出來(lái)
idArray.push(1);
// idPos = 0 重置當(dāng)前的計(jì)數(shù)器
idPos = 0;
}
// 說(shuō)明不是從第一行開(kāi)始遍歷的
else {
if (otherRowName) {
//主行之外的 另一行合并
if (
data[i][rowName] == data[i - 1][rowName] &&
data[i][otherRowName] == data[i - 1][otherRowName]
) {
// 如果相同就需要將 idArray 的數(shù)據(jù)自加
idArray[idPos] += 1;
// 同時(shí)需要將 idArray push一個(gè)0 表示下一行不用顯示
idArray.push(0);
}
// 說(shuō)明 當(dāng)前的數(shù)據(jù)和上一行的指定數(shù)據(jù)不同
else {
// idArray.push(1) 說(shuō)明當(dāng)前一行的數(shù)據(jù)需要顯示
idArray.push(1);
// 重新給計(jì)數(shù)器賦值
idPos = i;
}
} else {
// 判斷當(dāng)前的指定數(shù)據(jù)是否和之前的指定數(shù)據(jù)值相同
if (data[i][rowName] == data[i - 1][rowName]) {
// 如果相同就需要將 idArray 的數(shù)據(jù)自加
idArray[idPos] += 1;
// 同時(shí)需要將 idArray push一個(gè)0 表示下一行不用顯示
idArray.push(0);
}
// 說(shuō)明 當(dāng)前的數(shù)據(jù)和上一行的指定數(shù)據(jù)不同
else {
// idArray.push(1) 說(shuō)明當(dāng)前一行的數(shù)據(jù)需要顯示
idArray.push(1);
// 重新給計(jì)數(shù)器賦值
idPos = i;
}
}
}
}
return idArray;
}調(diào)用方法
let rowMergeArr = [] as number[];
let rowMergeArr1 = [] as number[];
/**
* @description 合并行
*/
interface SpanMethodProps {
row: PriceTableItem;
column: TableColumnCtx<PriceTableItem>;
rowIndex: number;
columnIndex: number;
}
const objectSpanMethod = ({
row,
column,
rowIndex,
columnIndex
}: SpanMethodProps) => {
// level列
if (columnIndex === 1) {
// rowMergeArr[rowIndex] 取出當(dāng)前存放行的合并狀態(tài)
const rowSpan = rowMergeArr[rowIndex];
// 判斷當(dāng)前的 列是否需要顯示
const colSpan = rowSpan > 0 ? 1 : 0;
return {
rowspan: rowSpan,
colspan: colSpan
};
}
// level列之后的 type列
if (columnIndex === 3) {
// rowMergeArr[rowIndex] 取出當(dāng)前存放行的合并狀態(tài)
const rowSpan = rowMergeArr1[rowIndex];
// 判斷當(dāng)前的 列是否需要顯示
const colSpan = rowSpan > 0 ? 1 : 0;
return {
rowspan: rowSpan,
colspan: colSpan
};
}
// ...如果還有繼續(xù)
};
onMounted(() => {
rowMergeArr = tableRowMerge(state.tableDataList, 'level');// 主列的行合并
rowMergeArr1 = tableRowMerge(state.tableDataList, 'level', 'type');// 其他列的行合并
});到此這篇關(guān)于vue3 elementplus table合并的文章就介紹到這了,更多相關(guān)vue3 elementplus table合并內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue3?element?plus?table?selection展示數(shù)據(jù),默認(rèn)選中功能方式
- element-plus的el-table自定義表頭篩選查詢功能實(shí)現(xiàn)
- Vue3+Element-Plus使用Table預(yù)覽圖片發(fā)生元素遮擋的解決方法
- vue3使用element-plus再次封裝table組件的基本步驟
- vue3使用elementPlus進(jìn)行table合并處理的示例詳解
- vue3+element Plus實(shí)現(xiàn)在table中增加一條表單數(shù)據(jù)的示例代碼
- vue3+elementplus基于el-table-v2封裝公用table組件詳細(xì)代碼
- Vue3中Element Plus Table(表格)點(diǎn)擊獲取對(duì)應(yīng)id方式
- Element?UI/Plus中全局修改el-table默認(rèn)樣式的解決方案
- ElementPlus?Table表格實(shí)現(xiàn)可編輯單元格
相關(guān)文章
Vue3使用v-if指令進(jìn)行條件渲染的實(shí)例代碼
條件渲染是根據(jù)條件的真假來(lái)有條件地渲染元素,在Vue.js 3.x中,常見(jiàn)的條件渲染包括使用v-if指令和v-show指令,本文講解使用v-if指令進(jìn)行條件渲染,需要的朋友可以參考下2024-03-03
vue 實(shí)現(xiàn)axios攔截、頁(yè)面跳轉(zhuǎn)和token 驗(yàn)證
這篇文章主要介紹了vue 實(shí)現(xiàn)axios攔截、頁(yè)面跳轉(zhuǎn)和token 驗(yàn)證,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Vue3的provide和inject實(shí)現(xiàn)多級(jí)傳遞的原理解析
Vue3中的provide和inject函數(shù)通過(guò)原型鏈實(shí)現(xiàn)數(shù)據(jù)的多級(jí)傳遞,父組件使用provide注入數(shù)據(jù),子組件和后代組件通過(guò)inject獲取這些數(shù)據(jù),在創(chuàng)建組件實(shí)例時(shí),子組件會(huì)繼承父組件的provides屬性對(duì)象,介紹Vue3的provide和inject實(shí)現(xiàn)多級(jí)傳遞的原理,需要的朋友可以參考下2024-12-12
vue+axios+java實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了vue+axios+java實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06
vue使用echarts基本原理以及報(bào)錯(cuò)提示undefined(reading?init)的解決過(guò)程
Vue2使用ECharts時(shí),因未全局注冊(cè)或錯(cuò)誤引入導(dǎo)致TypeError報(bào)錯(cuò),解決方法為全局注冊(cè),正確獲取DOM節(jié)點(diǎn)并設(shè)置寬高,通過(guò)生命周期或數(shù)據(jù)請(qǐng)求后調(diào)用getMain2方法初始化圖表,option對(duì)象需根據(jù)實(shí)際數(shù)據(jù)配置2025-09-09
vue通過(guò)v-show實(shí)現(xiàn)回到頂部top效果
這篇文章主要介紹了vue通過(guò)v-show實(shí)現(xiàn)回到頂部top效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12
Vue中高效數(shù)據(jù)抓取功能的實(shí)現(xiàn)與優(yōu)化
這篇文章主要記錄了從需求分析到完整實(shí)現(xiàn)一個(gè)高效數(shù)據(jù)抓取功能的開(kāi)發(fā)過(guò)程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-06-06

