vue封裝動(dòng)態(tài)表格方式詳解
前言
這里只是提供一種想法并提供一些快速實(shí)現(xiàn),實(shí)際這些技巧可以用在很多地方,如:動(dòng)態(tài)表單
實(shí)現(xiàn)方式簡(jiǎn)述
- 通過(guò)json定義要顯示的列
- 通過(guò)slot實(shí)現(xiàn)自定義列
- 通過(guò)
require.context實(shí)現(xiàn)組件的自動(dòng)注冊(cè),并通過(guò)<components is="xxx"></components>, 調(diào)用動(dòng)態(tài)注冊(cè)的組件
優(yōu)點(diǎn):
- 支持通過(guò)slot自定義擴(kuò)展
- 支持編寫vue文件擴(kuò)展列的顯示方式
- 支持通過(guò)json來(lái)控制列順序和哪些列需要顯示哪些不需要
- 能避免封裝的table組件越來(lái)越復(fù)雜
表格實(shí)現(xiàn):
<template>
<el-table :data="tableData" style="width: 100%" height="100%">
<el-table-column
v-for="column in columnList"
:key="column.prop"
v-bind="column.columnAttrs"
>
<template slot-scope="scope">
<slot
v-if="column.type === 'slot'"
:name="column.slotName"
:row="scope.row"
></slot>
<components
v-else
:row="scope.row"
:prop="column.prop"
:config="column"
:is="`column-${column.type}`"
></components>
</template>
</el-table-column>
</el-table>
</template>
<script>
const modules = {};
// 將當(dāng)前目錄以及子目錄中的index.vue自動(dòng)注冊(cè)為組件(require.context是webpack提供的,如果是vite要用vite的方式)
const files = require.context("./", true, /index.vue$/);
files.keys().forEach((item) => {
const name = item.split("/")[1];
modules[`column-${name}`] = files(item).default;
});
console.log(modules, "modules");
export default {
name: "CustomTable",
components: {
// 組件動(dòng)態(tài)注冊(cè)
...modules,
},
props: {
tableData: {
type: Array,
default: () => [],
},
columnList: {
type: Array,
default: () => [],
},
},
};
</script>
<style scoped></style>
func組件
<template>
<span>{{ config.call(row, config) }}</span>
</template>
<script>
export default {
name: "ColumnFunc",
props: {
config: {
type: Object,
},
row: {
type: Object,
},
},
};
</script>
<style scoped></style>
text組件:
<template>
<span>{{ row[config.prop] }}</span>
</template>
<script>
export default {
name: "ColumnText",
props: {
config: {
type: Object,
},
row: {
type: Object,
},
},
};
</script>
<style scoped></style>
調(diào)用示例
<template>
<CustomTable :column-list="columnList" :table-data="tableData">
<template #operate="{ row }">
<el-button size="small">刪除</el-button>
<el-button size="small" type="primary" @click="onEdit(row)">
編輯
</el-button>
</template>
</CustomTable>
</template>
<script>
import CustomTable from "@/components/my-table/CustomTable";
export default {
name: "CustomTableDemo",
components: {
CustomTable,
},
data() {
return {
columnList: [
{
type: "text",
prop: "name",
columnAttrs: {
label: "姓名",
width: "180",
},
},
{
type: "text",
prop: "date",
columnAttrs: {
label: "日期",
width: "180",
},
},
{
type: "func",
prop: "sex",
columnAttrs: {
label: "性別",
},
call: (row) => {
switch (row.sex) {
case 1: {
return "男";
}
case 2: {
return "女";
}
default: {
return "未知";
}
}
},
},
{
type: "slot",
slotName: "operate",
prop: "operate",
columnAttrs: {
label: "操作",
},
},
],
tableData: [
{
date: "2016-05-02",
name: "王小虎",
address: "上海市普陀區(qū)金沙江路 1518 弄",
sex: 1,
},
{
date: "2016-05-04",
name: "王小虎",
address: "上海市普陀區(qū)金沙江路 1517 弄",
sex: 2,
},
{
date: "2016-05-01",
name: "王小虎",
address: "上海市普陀區(qū)金沙江路 1519 弄",
sex: 3,
},
],
};
},
methods: {
onEdit(row) {
console.log(row);
},
},
};
</script>
<style scoped></style>
效果

參考文章
以上就是vue封裝動(dòng)態(tài)表格方式詳解的詳細(xì)內(nèi)容,更多關(guān)于vue封裝動(dòng)態(tài)表格的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue router 組件的高級(jí)應(yīng)用實(shí)例代碼
這篇文章主要介紹了vue-router 組件的高級(jí)應(yīng)用,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
Vue代理請(qǐng)求數(shù)據(jù)出現(xiàn)404問題及解決
這篇文章主要介紹了Vue代理請(qǐng)求數(shù)據(jù)出現(xiàn)404的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07
vue-video-player 通過(guò)自定義按鈕組件實(shí)現(xiàn)全屏切換效果【推薦】
這篇文章主要介紹了vue-video-player,通過(guò)自定義按鈕組件實(shí)現(xiàn)全屏切換效果,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08
使用Vue3+PDF.js實(shí)現(xiàn)PDF預(yù)覽功能
項(xiàng)目中有一個(gè)需要預(yù)覽下載pdf的需求,網(wǎng)上找了很久,決定使用 pdf.js 完成,下面這篇文章主要給大家介紹了關(guān)于使用Vue3+PDF.js實(shí)現(xiàn)PDF預(yù)覽功能的相關(guān)資料,需要的朋友可以參考下2022-12-12
vue中mock數(shù)據(jù),模擬后臺(tái)接口實(shí)例
這篇文章主要介紹了vue中mock數(shù)據(jù),模擬后臺(tái)接口實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
Vue 實(shí)現(xiàn)一個(gè)命令式彈窗組件功能
這篇文章主要介紹了vue實(shí)現(xiàn)命令式彈窗組件功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
詳解利用eventemitter2實(shí)現(xiàn)Vue組件通信
這篇文章主要介紹了詳解利用eventemitter2實(shí)現(xiàn)Vue組件通信,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Vue使用Element-UI生成并展示表頭序號(hào)的方法
序號(hào)算是在展示數(shù)據(jù)的時(shí)候,一種很普遍的屬性了,我們可以自己寫生成序號(hào)的規(guī)則,也可以借助第三方,這篇文章主要介紹了Vue使用Element-UI生成并展示表頭序號(hào)的方法,需要的朋友可以參考下2023-01-01
vue項(xiàng)目報(bào)錯(cuò):Missing?script:"serve"的解決辦法
這篇文章主要給大家介紹了關(guān)于vue項(xiàng)目報(bào)錯(cuò):Missing?script:"serve"的解決辦法,"missing script: serve"是一個(gè)錯(cuò)誤信息,意味著在執(zhí)行啟動(dòng)腳本時(shí),找不到名為"serve"的腳本,需要的朋友可以參考下2023-11-11

