vue2 elementui 封装一个动态表格复杂组件

在 Vue 2 和 Element UI 中封装一个动态表格组件意味着要创建一个组件,它能够根据传入的数据和配置动态地生成表格,并支持排序、筛选、分页等功能。以下是一个基本的示例,展示了如何创建一个这样的动态表格组件:

首先,确保你已经安装了 Element UI,并在你的 Vue 项目中正确地引入和使用了它。

然后,创建一个新的 Vue 组件,比如 DynamicTable.vue

复制代码
<template>
  <el-table
    :data="tableData"
    style="width: 100%"
    @sort-change="handleSortChange"
  >
    <el-table-column
      v-for="(column, index) in columns"
      :key="index"
      :prop="column.prop"
      :label="column.label"
      :sortable="column.sortable"
      :filters="column.filters"
      :filter-method="column.filterMethod"
    >
    </el-table-column>
  </el-table>
  <el-pagination
    @size-change="handleSizeChange"
    @current-change="handleCurrentChange"
    :current-page="currentPage"
    :page-sizes="[10, 20, 30, 40]"
    :page-size="pageSize"
    layout="total, sizes, prev, pager, next, jumper"
    :total="totalItems">
  </el-pagination>
</template>

<script>
export default {
  name: 'DynamicTable',
  props: {
    columns: {
      type: Array,
      required: true,
    },
    data: {
      type: Array,
      required: true,
    },
  },
  data() {
    return {
      tableData: [],
      currentPage: 1,
      pageSize: 10,
      sort: {
        prop: '',
        order: '',
      },
      totalItems: 0,
    };
  },
  computed: {
    filteredData() {
      if (!this.sort.prop) return this.data;
      return this.data.sort((a, b) => {
        if (a[this.sort.prop] < b[this.sort.prop]) return this.sort.order === 'ascending' ? -1 : 1;
        if (a[this.sort.prop] > b[this.sort.prop]) return this.sort.order === 'ascending' ? 1 : -1;
        return 0;
      });
    },
    paginatedData() {
      const start = (this.currentPage - 1) * this.pageSize;
      const end = this.currentPage * this.pageSize;
      return this.filteredData.slice(start, end);
    },
  },
  watch: {
    data(newData) {
      this.totalItems = newData.length;
      this.tableData = newData.slice();
    },
  },
  methods: {
    handleSortChange({ column, prop, order }) {
      this.sort.prop = prop;
      this.sort.order = order;
    },
    handleSizeChange(val) {
      this.pageSize = val;
      this.currentPage = 1;
    },
    handleCurrentChange(val) {
      this.currentPage = val;
    },
  },
  mounted() {
    this.tableData = this.data.slice();
  },
};
</script>

<style scoped>
/* 你可以在这里添加一些自定义的样式 */
</style>
相关推荐
jump_jump3 小时前
基于 Squoosh WASM 的浏览器端图片转换库
前端·javascript·性能优化
小二·6 小时前
前端监控体系完全指南:从错误捕获到用户行为分析(Vue 3 + Sentry + Web Vitals)
前端·vue.js·sentry
阿珊和她的猫7 小时前
`require` 与 `import` 的区别剖析
前端·webpack
+VX:Fegn08957 小时前
计算机毕业设计|基于springboot + vue在线音乐播放系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
谎言西西里8 小时前
零基础 Coze + 前端 Vue3 边玩边开发:宠物冰球运动员生成器
前端·coze
+VX:Fegn08958 小时前
计算机毕业设计|基于springboot + vue律师咨询系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
努力的小郑8 小时前
2025年度总结:当我在 Cursor 里敲下 Tab 的那一刻,我知道时代变了
前端·后端·ai编程
GIS之路8 小时前
GDAL 实现数据空间查询
前端
OEC小胖胖8 小时前
01|从 Monorepo 到发布产物:React 仓库全景与构建链路
前端·react.js·前端框架
2501_944711439 小时前
构建 React Todo 应用:组件通信与状态管理的最佳实践
前端·javascript·react.js