Vue3+Element?Plus實(shí)現(xiàn)el-table跨行顯示(非腳手架)
app組件內(nèi)容
<div id="app">
<!-- 遠(yuǎn)程搜索 -->
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="任務(wù)名稱:" style="margin-left:30px;">
<el-select v-model="value" filterable remote clearable reserve-keyword placeholder="Please enter a keyword" :remote-method="remoteMethod" :loading="loading">
<el-option v-for="item in options" :key="item.CODE" :label="item.NAME" :value="item.CODE" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查詢</el-button>
</el-form-item>
</el-form>
<!-- 表格數(shù)據(jù) -->
<el-table :data="tableData" stripe border style="width: 98%;" :span-method="objectSpanMethod" max-height="650">
<el-table-column fixed prop="CODE" label="編碼" width="60"></el-table-column>
<el-table-column prop="NAME" label="名稱"></el-table-column>
<el-table-column prop="FREQUENCY" label="頻次" width="80"></el-table-column>
<el-table-column prop="FNAME" label="執(zhí)行科室" width="150"></el-table-column>
<el-table-column prop="FILENAME" label="文件名稱"></el-table-column>
<el-table-column prop="STATUS" label="狀態(tài)" width="80"></el-table-column>
<el-table-column prop="CREATEID" label="上傳人" width="80"></el-table-column>
<el-table-column prop="CREATEDATE" label="上傳時(shí)間"></el-table-column>
</el-table>
</div>使用:span-method="objectSpanMethod"自定義方法實(shí)現(xiàn)跨行顯示
const objectSpanMethod = ({
row,
column,
rowIndex,
columnIndex
}) => {
const columnsToSpan = ['CODE', 'NAME', 'FNAME', 'FREQUENCY']; // 列名數(shù)組
if (columnsToSpan.includes(column.property)) {
if (rowIndex === 0 || row[column.property] !== tableData.value[rowIndex - 1][column.property]) {
// 如果是相同 "NAME" 的第一行,則返回正確的 rowspan 和 colspan
let rowspan = 1;
for (let i = rowIndex + 1; i < tableData.value.length; i++) {
if (tableData.value[i][column.property] === row[column.property]) {
rowspan++;
tableData.value[i]._rowspan = 0; // 隱藏后續(xù)行的 "NAME"
} else {
break;
}
}
return {
rowspan,
colspan: 1
};
}
return {
rowspan: 0,
colspan: 0
}; // 隱藏相同 "NAME" 的后續(xù)行
}
return {
rowspan: 1,
colspan: 1
};
}查詢方法
const onSubmit = (boolen) => {
// 在這里獲取輸入的值
const inputValue = value.value;
if ((inputValue !== null && inputValue !== undefined && inputValue !== '') || boolen) {
// console.log("Input Value:", inputValue);
// axios.get(UJCAjaxBaseUrl + "/請(qǐng)求地址", {
// params: {
// TaskId: inputValue
// }
// }).then((response) => {
// console.log("response:" + response.data.data);
// tableData.value = response.data.data;
// return true;
// }).catch((error) => {
// console.error('發(fā)生錯(cuò)誤:', error);
// return false;
// });
} else {
showErrorMessage('請(qǐng)搜索并選擇您要查詢的細(xì)則編碼或細(xì)則名稱!');
return false;
}初始化掛載
//初始化掛載
onMounted(() => {
list.value = states.map((item) => {
return {
value: item
};
});
onSubmit(true);
});新建一個(gè)html即可進(jìn)行測試,完整代碼如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vue 3 回車鍵示例</title>
<!-- 引入 Vue 3 和 Element Plus -->
<!-- 包含 Vue 3 庫 -->
<script src="https://cdn.jsdelivr.net/npm/vue@3.3.4/dist/vue.global.min.js"></script>
<!-- 包含 Element Plus 的 CSS 樣式 -->
<link rel="stylesheet" >
<!-- 包含 Element Plus 的 JavaScript 文件 -->
<script src="https://cdn.jsdelivr.net/npm/element-plus@2.3.9/dist/index.full.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.5.0/axios.min.js"></script>
</head>
<body>
<div id="app">
<!-- 遠(yuǎn)程搜索 -->
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="任務(wù)名稱:" style="margin-left:30px;">
<el-select v-model="value" filterable remote clearable reserve-keyword placeholder="Please enter a keyword" :remote-method="remoteMethod" :loading="loading">
<el-option v-for="item in options" :key="item.CODE" :label="item.NAME" :value="item.CODE" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查詢</el-button>
</el-form-item>
</el-form>
<!-- 表格數(shù)據(jù) -->
<el-table :data="tableData" stripe border style="width: 98%;" :span-method="objectSpanMethod" max-height="650">
<el-table-column fixed prop="CODE" label="編碼" width="60"></el-table-column>
<el-table-column prop="NAME" label="名稱"></el-table-column>
<el-table-column prop="FREQUENCY" label="頻次" width="80"></el-table-column>
<el-table-column prop="FNAME" label="執(zhí)行科室" width="150"></el-table-column>
<el-table-column prop="FILENAME" label="文件名稱"></el-table-column>
<el-table-column prop="STATUS" label="狀態(tài)" width="80"></el-table-column>
<el-table-column prop="CREATEID" label="上傳人" width="80"></el-table-column>
<el-table-column prop="CREATEDATE" label="上傳時(shí)間"></el-table-column>
</el-table>
</div>
<script>
const {
createApp,
reactive,
ref,
onMounted,
onBeforeMount,
onUpdated,
ElMessage
} = Vue;
const vue3DepartFileStatis = {
setup() {
//定義響應(yīng)數(shù)據(jù)
const list = ref([]);
const options = ref([]);
const value = ref([]);
const loading = ref(false);
const tableData = ref([]); //表格響應(yīng)式
let formInline = reactive({
keyword: ""
});
const isMessageShowing = ref(false);
//初始化掛載
onMounted(() => {
list.value = states.map((item) => {
return {
value: item
};
});
onSubmit(true);
});
//遠(yuǎn)程搜索
const remoteMethod = (query) => {
//if (query) {
// loading.value = true;
// setTimeout(() => {
// loading.value = false;
// options.value = list.value.filter((item) => {
// return item.value.toLowerCase().includes(query.toLowerCase())
// });
// }, 200);
//} else {
// options.value = [];
//}
if (query) {
loading.value = true;
console.log(query);
// 發(fā)送 Axios 請(qǐng)求
axios.get(UJCAjaxBaseUrl + "/請(qǐng)求地址", {
params: {
TaskName: query
}
}).then((response) => {
loading.value = false;
options.value = response.data.data;
console.log(response.data.data);
}).catch((error) => {
console.error('發(fā)生錯(cuò)誤:', error);
loading.value = false;
});
} else {
options.value = [];
}
}
//封裝錯(cuò)誤提示
const showErrorMessage = (message = 'Oops, this is a error message.') => {
if (!isMessageShowing.value) {
isMessageShowing.value = true;
ElementPlus.ElMessage({
showClose: true,
message: message,
type: 'error',
onClose: () => {
isMessageShowing.value = false;
},
});
}
};
//查詢
const onSubmit = (boolen) => {
// 在這里獲取輸入的值
const inputValue = value.value;
if ((inputValue !== null && inputValue !== undefined && inputValue !== '') || boolen) {
// console.log("Input Value:", inputValue);
// axios.get(UJCAjaxBaseUrl + "/請(qǐng)求地址", {
// params: {
// TaskId: inputValue
// }
// }).then((response) => {
// console.log("response:" + response.data.data);
// tableData.value = response.data.data;
// return true;
// }).catch((error) => {
// console.error('發(fā)生錯(cuò)誤:', error);
// return false;
// });
} else {
showErrorMessage('請(qǐng)搜索并選擇您要查詢的細(xì)則編碼或細(xì)則名稱!');
return false;
}
//模擬數(shù)據(jù)
tableData.value = [{
CODE: '001',
NAME: 'Item A',
FREQUENCY: 'Daily',
FNAME: 'Department A',
FILENAME: 'File A',
STATUS: 'Active',
CREATEID: 'User 1',
CREATEDATE: '2023-09-06'
}, {
CODE: '002',
NAME: 'Item A',
FREQUENCY: 'Weekly',
FNAME: 'Department B',
FILENAME: 'File B',
STATUS: 'Inactive',
CREATEID: 'User 2',
CREATEDATE: '2023-09-07'
}, {
CODE: '003',
NAME: 'Item B',
FREQUENCY: 'Monthly',
FNAME: 'Department C',
FILENAME: 'File C',
STATUS: 'Active',
CREATEID: 'User 3',
CREATEDATE: '2023-09-08'
}, {
CODE: '004',
NAME: 'Item B',
FREQUENCY: 'Daily',
FNAME: 'Department A',
FILENAME: 'File D',
STATUS: 'Inactive',
CREATEID: 'User 4',
CREATEDATE: '2023-09-09'
}]
}
//模擬數(shù)據(jù)
const states = [];
const objectSpanMethod = ({
row,
column,
rowIndex,
columnIndex
}) => {
const columnsToSpan = ['CODE', 'NAME', 'FNAME', 'FREQUENCY']; // 列名數(shù)組
if (columnsToSpan.includes(column.property)) {
if (rowIndex === 0 || row[column.property] !== tableData.value[rowIndex - 1][column.property]) {
// 如果是相同 "NAME" 的第一行,則返回正確的 rowspan 和 colspan
let rowspan = 1;
for (let i = rowIndex + 1; i < tableData.value.length; i++) {
if (tableData.value[i][column.property] === row[column.property]) {
rowspan++;
tableData.value[i]._rowspan = 0; // 隱藏后續(xù)行的 "NAME"
} else {
break;
}
}
return {
rowspan,
colspan: 1
};
}
return {
rowspan: 0,
colspan: 0
}; // 隱藏相同 "NAME" 的后續(xù)行
}
return {
rowspan: 1,
colspan: 1
};
}
return {
list,
options,
value,
loading,
remoteMethod,
onSubmit,
tableData,
formInline,
objectSpanMethod
}
}
}
createApp(vue3DepartFileStatis)
.use(ElementPlus).mount("#app"); // 掛載應(yīng)用到指定元素上
</script>
</body>
</html>效果圖

到此這篇關(guān)于Vue3+Element Plus實(shí)現(xiàn)el-table跨行顯示(非腳手架)的文章就介紹到這了,更多相關(guān)Vue3+Element Plus el-table跨行顯示內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- vue3+elementplus基于el-table-v2封裝公用table組件詳細(xì)代碼
- vue3使用element-plus中el-table組件報(bào)錯(cuò)關(guān)鍵字'emitsOptions'與'insertBefore'分析
- Vue2+Element-ui實(shí)現(xiàn)el-table表格自適應(yīng)高度的案例
- 一文解決vue2 element el-table自適應(yīng)高度問題
- VUE2.0 ElementUI2.0表格el-table自適應(yīng)高度的實(shí)現(xiàn)方法
- Vue 3 中使用 Element Plus 的 `el-table` 組件實(shí)現(xiàn)自適應(yīng)高度
相關(guān)文章
解決vue3項(xiàng)目中el-menu不兼容SSR問題
這篇文章主要介紹了解決vue3項(xiàng)目中el-menu不兼容SSR問題,需要的朋友可以參考下2023-12-12
使用Vue.js和MJML創(chuàng)建響應(yīng)式電子郵件
這篇文章主要介紹了使用Vue.js和MJML創(chuàng)建響應(yīng)式電子郵件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
DeepSeek?助力?Vue?開發(fā)絲滑的步驟條效果(過程詳解)
本文詳細(xì)介紹了如何使用Vue.js和ElementUI創(chuàng)建一個(gè)進(jìn)度條組件,并將所有代碼保存在一個(gè)文件夾中,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-02-02
解決Vite無法分析出動(dòng)態(tài)import的類型,控制臺(tái)出警告的問題
這篇文章主要介紹了解決Vite無法分析出動(dòng)態(tài)import的類型,控制臺(tái)出警告的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
深入淺出 Vue 系列 -- 數(shù)據(jù)劫持實(shí)現(xiàn)原理
深入淺出 Vue 系列 -- 數(shù)據(jù)劫持實(shí)現(xiàn)原理2019-04-04
vue3+element?Plus使用el-tabs標(biāo)簽頁解決頁面刷新不回到默認(rèn)頁的問題
這篇文章主要介紹了vue3+element?Plus使用el-tabs標(biāo)簽頁頁面刷新不回到默認(rèn)頁的操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
案例實(shí)操vue事件修飾符帶你快速了解與應(yīng)用
這篇文章主要介紹了vue常見的事件修飾符,在平時(shí)無論是面試還是學(xué)習(xí)工作中都會(huì)經(jīng)常遇到的,本文就帶你快速上手,需要的朋友可以參考下2023-03-03

