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>
相关推荐
蓝瑟忧伤21 分钟前
前端技术新十年:从工程体系到智能化开发的全景演进
前端
Baklib梅梅43 分钟前
员工手册:保障运营一致性与提升组织效率的核心载体
前端·ruby on rails·前端框架·ruby
涔溪1 小时前
实现将 Vue2 子应用通过无界(Wujie)微前端框架接入到 Vue3 主应用中(即 Vue3 主应用集成 Vue2 子应用)
vue.js·微前端·wujie
IT_陈寒1 小时前
Redis性能翻倍的5个冷门技巧,90%开发者都不知道第3个!
前端·人工智能·后端
T***u3332 小时前
前端框架在性能优化中的实践
javascript·vue.js·前端框架
jingling5553 小时前
vue | 在 Vue 3 项目中集成高德地图(AMap)
前端·javascript·vue.js
油丶酸萝卜别吃3 小时前
Vue3 中如何在 setup 语法糖下,通过 Layer 弹窗组件弹出自定义 Vue 组件?
前端·vue.js·arcgis
J***Q2929 小时前
Vue数据可视化
前端·vue.js·信息可视化
JIngJaneIL10 小时前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·社区互助
ttod_qzstudio11 小时前
深入理解 Vue 3 的 h 函数:构建动态 UI 的利器
前端·vue.js