最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3+Element Plus 通用表格組件封裝與使用實踐

 更新時間:2026年02月27日 14:44:45   作者:_AaronWong  
在中后臺項目開發(fā)中,表格是高頻使用的核心組件,基于 Element Plus 的el-table封裝通用表格組件,能夠統(tǒng)一表格樣式、簡化重復(fù)代碼、提升開發(fā)效率,下面就來詳細的介紹一下如何封裝,感興趣的可以了解一下

在中后臺項目開發(fā)中,表格是高頻使用的核心組件,基于 Element Plus 的el-table封裝通用表格組件,能夠統(tǒng)一表格樣式、簡化重復(fù)代碼、提升開發(fā)效率。本文將詳細講解一款通用表格組件的封裝思路、完整實現(xiàn)及使用方式,該組件兼顧了通用性與靈活性,適配日常開發(fā)中的各類表格場景。

一、封裝思路

本次封裝的核心目標是打造一款「基礎(chǔ)能力通用化、個性化配置靈活化」的表格組件:

  1. 抽離表格通用配置(如高度、高亮行、合并單元格方法)作為基礎(chǔ) Props;
  2. el-tableel-pagination的原生屬性 / 事件通過透傳方式交給父組件控制,保留原生組件的靈活性;
  3. 統(tǒng)一列渲染邏輯,支持自定義render函數(shù)實現(xiàn)復(fù)雜單元格內(nèi)容展示;
  4. 整合表格標題、分頁等常用元素,形成完整的表格模塊。

二、通用表格組件完整實現(xiàn)(MineTable.vue)

<template>
    <el-card class="mine-table">
        <!-- 表格標題 -->
        <el-text class="table-name">{{ tableName }}</el-text>
        <!-- 核心表格容器 -->
        <el-table 
            ref="elTable" 
            class="base-table" 
            :highlight-current-row="currentRow" 
            :preserve-expanded-content="true" 
            :span-method="spanMethod"
            :data="data" 
            :height="height"
            v-bind="tableProps"   <!-- 透傳el-table原生屬性 -->
            v-on="tableEvents"    <!-- 透傳el-table原生事件 -->
        >
            <el-table-column 
                v-for="(item, index) in columnsData" 
                :key="index" 
                v-bind="item"      <!-- 透傳列配置屬性 -->
            >
                <!-- 展開列自定義渲染 -->
                <template v-if="item.type === 'expand'" #default="scope">
                    <component :is="item.render" v-bind="scope"></component>
                </template>
            </el-table-column>
        </el-table>

        <!-- 分頁組件 -->
        <el-pagination 
            class="base-pagination" 
            layout="total, sizes, prev, pager, next, jumper"
            :page-sizes="[5, 10, 20, 30, 40, 50]" 
            background
            v-bind="paginationProps"  <!-- 透傳el-pagination原生屬性 -->
            v-on="paginationEvents"   <!-- 透傳el-pagination原生事件 -->
        />
    </el-card>
</template>

<script setup>
import { computed, ref } from "vue"

// 關(guān)閉默認屬性透傳,避免屬性泄露到外層DOM節(jié)點
defineOptions({
    inheritAttrs: false
})

// 定義組件Props
const props = defineProps({
    // 表格基礎(chǔ)配置
    tableName: { type: String, default: "", description: "表格標題" },
    currentRow: { type: Boolean, default: false, description: "是否高亮當(dāng)前行" },
    height: { type: String, default: "60vh", description: "表格高度" },
    data: { type: Array, default: () => [], description: "表格數(shù)據(jù)源" },
    columns: { type: Array, default: () => [], description: "列配置項" },
    spanMethod: { type: Function, default: () => {}, description: "單元格合并方法" },
    
    // el-table原生屬性透傳(支持所有el-table屬性)
    tableProps: { type: Object, default: () => ({}) },
    // el-table原生事件透傳(支持所有el-table事件)
    tableEvents: { type: Object, default: () => ({}) },
    
    // el-pagination原生屬性透傳(支持所有el-pagination屬性)
    paginationProps: { type: Object, default: () => ({}) },
    // el-pagination原生事件透傳(支持所有el-pagination事件)
    paginationEvents: { type: Object, default: () => ({}) },
})

// 暴露表格Ref,方便父組件調(diào)用el-table的原生方法
const elTable = ref(null)
defineExpose({ elTable })

// 列數(shù)據(jù)格式化處理,統(tǒng)一支持render函數(shù)渲染
const columnsData = computed(() => {
    return props.columns.map(item => ({
        formatter: (row, column, cellValue, index) => formatter(item, row, column, cellValue, index),
        ...item
    }))
})

// 單元格內(nèi)容格式化邏輯
const formatter = (item, row, column, cellValue, index) => {
    // 優(yōu)先級:行數(shù)據(jù)中的render函數(shù) > 列配置中的render函數(shù) > 默認值
    if (row?.[column.property]?.render) {
        return row[column.property].render(row, column, cellValue, index)
    } else if (item?.render) {
        return item.render(row, column, cellValue, index)
    }
    return row[column.property]
}
</script>

<style lang="scss" scoped>
.mine-table {
    width: 100%;
    display: flex;
    flex-direction: column;
    align-items: center;
    
    .table-name {
        font-size: 18px;
        font-weight: bold;
        margin-bottom: 12px;
        display: flex;
        align-items: center;
        &::after {
            content: "";
            width: 5px;
            height: 100%;
            background-color: var(--el-color-primary);
            margin-right: 12px;
        }
    }

    .base-table {
        width: 100%;
        margin: 0 auto;
        min-width: 0;
        border: var(--el-table-border);
        border-radius: 4px;
    }

    .base-pagination {
        margin-top: 12px;
    }
}
</style>

核心封裝點說明

  1. 屬性 / 事件透傳:通過tableProps/tableEvents、paginationProps/paginationEvents分別透傳el-tableel-pagination的原生屬性與事件,既保留了原生組件的全部能力,又無需在組件內(nèi)重復(fù)定義中轉(zhuǎn)邏輯。
  2. 統(tǒng)一列渲染:封裝了formatter函數(shù),支持兩種自定義渲染方式 —— 列配置中的render函數(shù)、行數(shù)據(jù)中的render函數(shù),滿足復(fù)雜單元格的展示需求。
  3. 基礎(chǔ)樣式整合:內(nèi)置了表格標題、表格容器、分頁的統(tǒng)一樣式,無需在業(yè)務(wù)頁面重復(fù)編寫樣式代碼。
  4. Ref 暴露:將el-table的 Ref 暴露給父組件,方便調(diào)用clearSelection、toggleRowSelection等原生方法。

三、組件使用示例

1. 基礎(chǔ)使用(僅核心配置)

這是最常用的場景,只需配置表格數(shù)據(jù)、列配置、基礎(chǔ)樣式即可:

<template>
  <div class="demo-container">
    <!-- 通用表格組件使用 -->
    <MineTable
      height="200px"
      tableName="用戶列表"
      :data="tableData"
      :columns="tableColumns"
    />
  </div>
</template>

<script setup>
import { ref } from "vue"
import MineTable from "@/components/MineTable.vue"
import { ElMessage, ElPopconfirm, ElButton, ElText } from "element-plus"

// 表格數(shù)據(jù)源
const tableData = ref([
  { id: 1, name: "張三", email: "zhangsan@example.com" },
  { id: 2, name: "李四", email: "lisi@example.com" },
  { id: 3, name: "王五", email: "wangwu@example.com" }
])

// 列配置項
const tableColumns = ref([
  { type: "index", label: "序號", width: 80 }, // 序號列
  {
    label: "用戶名稱",
    prop: "name",
    // 自定義單元格渲染
    render: (row) => <ElText type="primary">{row.name}</ElText>
  },
  {
    label: "操作",
    width: 100,
    // 操作列:帶確認彈窗的刪除按鈕
    render: (row) => {
      const deleteUser = () => {
        // 模擬刪除邏輯
        tableData.value = tableData.value.filter(item => item.id !== row.id)
        ElMessage.success(`已刪除用戶:${row.name}`)
      }

      return (
        <ElPopconfirm 
          title="確定刪除嗎?" 
          onConfirm={deleteUser}
          confirmButtonText="確定" 
          cancelButtonText="取消"
          v-slots={{
            reference: () => <ElButton type="danger" size="small" link>刪除</ElButton>
          }}
        />
      )
    }
  }
])
</script>

<style scoped>
.demo-container {
  width: 800px;
  margin: 20px auto;
}
</style>

2. 進階使用(透傳原生屬性 / 事件)

如果需要使用el-tableel-pagination的原生能力(如斑馬紋、行點擊事件、分頁回調(diào)等),可通過透傳 Props 實現(xiàn):

<template>
  <div class="demo-container">
    <MineTable
      height="300px"
      tableName="用戶列表"
      :data="tableData"
      :columns="tableColumns"
      <!-- 透傳el-table原生屬性 -->
      :table-props="{
        border: true,        // 顯示表格邊框
        stripe: true,        // 斑馬紋效果
        showHeader: true     // 顯示表頭
      }"
      <!-- 透傳el-table原生事件 -->
      :table-events="{
        'row-click': (row) => ElMessage.info(`點擊了${row.name}的行`), // 行點擊事件
        'sort-change': (val) => console.log('排序變更:', val)       // 排序變更事件
      }"
      <!-- 透傳el-pagination原生屬性 -->
      :pagination-props="{
        currentPage: 1,      // 當(dāng)前頁碼
        pageSize: 10,        // 每頁條數(shù)
        total: 100           // 總條數(shù)
      }"
      <!-- 透傳el-pagination原生事件 -->
      :pagination-events="{
        'size-change': (size) => console.log('每頁條數(shù)變更:', size), // 頁大小變更
        'current-change': (page) => console.log('頁碼變更:', page)   // 頁碼變更
      }"
    />
  </div>
</template>

四、總結(jié)

本次封裝的通用表格組件具備以下特點:

  1. 通用性強:整合了表格標題、分頁等常用元素,統(tǒng)一了基礎(chǔ)樣式和渲染邏輯;
  2. 靈活性高:通過屬性 / 事件透傳,保留了 Element Plus 原生組件的全部能力,適配各類個性化需求;
  3. 易用性好:使用方式簡潔,基礎(chǔ)場景只需配置數(shù)據(jù)和列,進階場景可透傳原生屬性 / 事件;
  4. 可擴展:在此基礎(chǔ)上可進一步擴展空狀態(tài)、加載狀態(tài)、列寬自適應(yīng)等通用能力,適配更多業(yè)務(wù)場景。

該組件能夠有效減少中后臺項目中表格相關(guān)的重復(fù)代碼,提升開發(fā)效率,同時保持了足夠的靈活性,滿足不同業(yè)務(wù)場景的個性化需求。

到此這篇關(guān)于Vue3+Element Plus 通用表格組件封裝與使用實踐的文章就介紹到這了,更多相關(guān)Vue3 Element Plus 表格封裝內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vite中的glob-import批量導(dǎo)入的實現(xiàn)

    vite中的glob-import批量導(dǎo)入的實現(xiàn)

    本文主要介紹了vite中的glob-import批量導(dǎo)入的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • vue2和elementUI?實現(xiàn)落日余暉登錄頁和滑塊校驗功能

    vue2和elementUI?實現(xiàn)落日余暉登錄頁和滑塊校驗功能

    這篇文章主要介紹了vue2和elementUI打造落日余暉登錄頁和滑塊校驗,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • vue開發(fā)中關(guān)于axios的封裝過程

    vue開發(fā)中關(guān)于axios的封裝過程

    這篇文章主要介紹了vue開發(fā)中關(guān)于axios的封裝過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue.js在數(shù)組中插入重復(fù)數(shù)據(jù)的實現(xiàn)代碼

    Vue.js在數(shù)組中插入重復(fù)數(shù)據(jù)的實現(xiàn)代碼

    這篇文章主要介紹了Vue.js在數(shù)組中插入重復(fù)數(shù)據(jù)的實現(xiàn)代碼,需要的朋友可以參考下
    2017-11-11
  • vue項目中企業(yè)微信使用js-sdk時config和agentConfig配置方式詳解

    vue項目中企業(yè)微信使用js-sdk時config和agentConfig配置方式詳解

    這篇文章主要介紹了vue項目中企業(yè)微信使用js-sdk時config和agentConfig配置,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • Vue?Scoped樣式混淆的問題分析與解決方案

    Vue?Scoped樣式混淆的問題分析與解決方案

    在Vue組件中,我們經(jīng)常使用<style?scoped>屬性來實現(xiàn)樣式封裝,期望組件樣式只對當(dāng)前組件生效,不會污染全局樣式,然而,在實際開發(fā)中,即使使用了scoped屬性,同名樣式類的混淆問題仍然時有發(fā)生,所以本文介紹了Vue?Scoped樣式混淆的問題分析與解決方案,需要的朋友可以參考下
    2025-10-10
  • element?select必填項驗證回顯問題的解決

    element?select必填項驗證回顯問題的解決

    本文主要介紹了element?select必填項驗證回顯問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Vue中動態(tài)綁定Ref的兩種方式總結(jié)

    Vue中動態(tài)綁定Ref的兩種方式總結(jié)

    Vue3中的ref是一種創(chuàng)建響應(yīng)式引用的方式,它在Vue生態(tài)系統(tǒng)中扮演著重要角色,下面這篇文章主要給大家介紹了關(guān)于Vue中動態(tài)綁定Ref的兩種方式,需要的朋友可以參考下
    2024-09-09
  • Vue 中axios配置實例詳解

    Vue 中axios配置實例詳解

    本文通過實例代碼給大家介紹了Vue axios配置,非常不錯,代碼簡單易懂,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • 淺談Vue.js 組件中的v-on綁定自定義事件理解

    淺談Vue.js 組件中的v-on綁定自定義事件理解

    這篇文章主要介紹了淺談Vue.js 組件中的v-on綁定自定義事件理解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11

最新評論

陕西省| 商都县| 新竹市| 波密县| 临洮县| 孟连| 岳普湖县| 广西| 繁昌县| 定州市| 固始县| 松溪县| 娱乐| 温州市| 玛纳斯县| 石首市| 乐亭县| 饶阳县| 合山市| 江阴市| 常州市| 溧水县| 邯郸市| 丰镇市| 南涧| 开江县| 平顶山市| 和硕县| 康定县| 建湖县| 关岭| 象山县| 和平区| 绥阳县| 木兰县| 嘉荫县| 赣榆县| 峨山| 新野县| 苍南县| 盐池县|