跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

Vue 项目实战:全局封装 Element UI 表格组件

针对 Vue 项目中频繁使用 Element UI 表格的场景,分享一种全局二次封装方案。通过自定义 NewTable 组件统一处理列渲染、选择器及加载状态,减少重复代码并提升维护效率。支持动态配置列属性与插槽,结合 $attrs 透传实现高度复用,适用于后台管理系统快速开发。

1qazxsw2发布于 2020/7/12更新于 2026/6/819 浏览
Vue 项目实战:全局封装 Element UI 表格组件

Vue 项目实战:全局封装 Element UI 表格组件

在维护中大型后台管理系统时,我们常遇到表格配置重复、样式不统一的问题。与其在每个页面重复编写 el-table 的模板和逻辑,不如将其二次封装为一个全局组件。这样既能保证交互体验的一致性,又能大幅减少样板代码。

核心思路

我们将封装一个名为 NewTable 的组件,它接收 tableOption 作为配置项,内部根据配置动态生成列结构。利用 Vue 2 的 $attrs 透传机制,可以将原生 el-table 的属性直接传递给底层组件,实现高度灵活的控制。

组件实现

首先创建 new-table/index.vue 文件。这里重点处理了表头渲染逻辑,支持索引、多选以及自定义插槽渲染。

<template>
  <div class="new_table">
    <div class="table_main">
      <el-table
        ref="table"
        :data="tableDataList"
        :span-method="objectSpanMethod"
        :highlight-current-row="true"
        v-bind="$attrs"
        border
        @selection-change="selectionChange"
        v-loading="tableLoading"
        style="width: 100%"
      >
        <template v-for="(col, index) in tableOption.columns">
          <!-- 序号列 -->
          <template v-if="col.type == 'index'">
            <el-table-column
              type="index"
              :key="index"
              :label="col.label || '编号'"
              :width="col.width || 50"
              align="center"
            ></el-table-column>
          </template>

          <!-- 选择列 -->
          <template v-if="col.type == 'selection'">
            <el-table-column
              type="selection"
              :key="index"
              :width="col.width || 50"
              align="center"
            ></el-table-column>
          </template>

          <!-- 文本列及自定义渲染 -->
          <template v-if="col.type == 'text'">
            <template v-if="col.render">
              <el-table-column
                :key="index"
                :show-overflow-tooltip="!!col.overflow"
                :align="col.align || 'left'"
                :sortable="!!col.sortable"
                :prop="col.prop"
                :label="col.label"
                :width="col.width || ''"
              >
                <template slot-scope="scope">
                  <table-render
                    :render="col.render"
                    :scope="scope"
                    :prop="col.prop"
                  ></table-render>
                </template>
              </el-table-column>
            </template>
            <template v-else>
              <el-table-column
                :key="index"
                :show-overflow-tooltip="!!col.overflow"
                :align="col.align || 'left'"
                :sortable="!!col.sortable"
                :prop="col.prop"
                :label="col.label"
                :width="col.width || ''"
              ></el-table-column>
            </template>
          </template>
        </template>
      </el-table>
    </div>
  </div>
</template>

<script>
export default {
  name: 'NewTable',
  props: {
    tableDataList: {
      type: Array,
      required: true
    },
    tableOption: {
      type: Object,
      default: () => ({})
    },
    tableLoading: {
      type: Boolean,
      default: false
    }
  },
  methods: {
    // 合并行策略示例
    objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (rowIndex % 2 === 0) {
        return { rowspan: 2, colspan: 1 };
      }
      return { rowspan: 0, colspan: 0 };
    },
    // 选中事件处理
    selectionChange(val) {
      this.$emit('selection-change', val);
    }
  }
};
</script>

<style scoped>
.new_table {
  padding: 10px;
}
.table_main {
  background: #fff;
  border-radius: 4px;
}
</style>

全局注册与使用

在 main.js 中引入并注册该组件,之后在任何页面直接使用 <new-table> 即可。

import NewTable from '@/components/new-table';
Vue.component('NewTable', NewTable);

使用时只需传入数据源和列配置,无需关心内部细节。这种写法特别适合列表页频繁变更的场景,后续若需调整分页逻辑或加载状态,只需修改封装组件一处即可。

注意事项

  1. 插槽兼容性:如果业务需要更复杂的自定义列,建议保留 slot-scope 并在外部提供默认插槽。
  2. 属性透传:v-bind="$attrs" 是 Vue 2 的特性,确保父组件传递的 class、style 等能正确生效。
  3. 性能优化:当数据量极大时,注意开启虚拟滚动或分页,避免 DOM 节点过多导致卡顿。

通过这种方式,我们不仅统一了团队内的表格风格,还让新成员能快速上手开发,减少了大量重复劳动。

目录

  1. Vue 项目实战:全局封装 Element UI 表格组件
  2. 核心思路
  3. 组件实现
  4. 全局注册与使用
  5. 注意事项
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Qwen-Image-Lightning:8 步实现高效文生图的蒸馏技术解析
  • Java 线程与锁:JLS 第 17 章核心机制解析
  • PHP 安装与配置教程
  • AI 时代数据库的融合与智能化演进
  • Windows 系统下 Python 环境变量设置指南
  • 前端加密 encrypt-labs 靶场:环境搭建与关卡解析
  • SpringBoot 整合 MyBatis-Plus 快速实现数据库 CRUD
  • Ubuntu 22.04 安装后启动卡死问题解决方案
  • Stable Diffusion WebUI 1.8.0 核心更新解析:显存优化与生成速度提升
  • OpenClaw Cron 系统设计:AI Agent 自主定时任务实现
  • 网页嵌入 3D 人物实现指南:基于 React 与 Three.js
  • C++ 继承详解:从概念定义到默认成员函数
  • 利用大疆 SRT 数据实现高精度 AR 视频投射
  • 前端 AI 实战:在浏览器中直接运行机器学习模型
  • 执行式 AI 数据交互核心语法:Agent 架构与实现
  • 使用 gpt-oss-20b-WEBUI 部署 AI 对话机器人
  • Win10 升级后频繁弹出 Microsoft 365 Copilot 窗口如何禁用
  • PTA L2-054 三点共线 C++ 题解与易错坑点分析
  • YOLOv8 模型 LibTorch C++ 部署与调用示例
  • BFF 架构详解:为前端量身定制的后端服务

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online