当前位置:首页 > VUE

vue实现table封装

2026-03-29 06:19:45VUE

Vue实现Table封装方法

封装一个可复用的Table组件是Vue项目中常见的需求,以下是一个基于Element UI或Ant Design Vue的封装方案:

基础Table封装

<template>
  <el-table
    :data="tableData"
    :border="border"
    :stripe="stripe"
    @selection-change="handleSelectionChange"
  >
    <template v-for="(col, index) in columns">
      <el-table-column
        v-if="col.type"
        :key="index"
        :type="col.type"
        :width="col.width"
      />
      <el-table-column
        v-else
        :key="index"
        :prop="col.prop"
        :label="col.label"
        :width="col.width"
      >
        <template #default="scope">
          <slot :name="col.prop" :row="scope.row">
            {{ scope.row[col.prop] }}
          </slot>
        </template>
      </el-table-column>
    </template>
  </el-table>
</template>

<script>
export default {
  props: {
    tableData: {
      type: Array,
      default: () => []
    },
    columns: {
      type: Array,
      default: () => []
    },
    border: Boolean,
    stripe: Boolean
  },
  methods: {
    handleSelectionChange(val) {
      this.$emit('selection-change', val)
    }
  }
}
</script>

使用示例

<template>
  <CustomTable
    :table-data="data"
    :columns="columns"
    border
    stripe
    @selection-change="handleSelect"
  >
    <template #status="{ row }">
      <el-tag :type="row.status | statusType">
        {{ row.status }}
      </el-tag>
    </template>
  </CustomTable>
</template>

<script>
export default {
  data() {
    return {
      data: [...],
      columns: [
        { type: 'selection', width: 55 },
        { prop: 'name', label: '姓名' },
        { prop: 'age', label: '年龄' },
        { prop: 'status', label: '状态' }
      ]
    }
  }
}
</script>

高级功能扩展

分页处理

<template>
  <div>
    <el-table ... />
    <el-pagination
      :current-page="currentPage"
      :page-size="pageSize"
      :total="total"
      @current-change="handlePageChange"
    />
  </div>
</template>

动态列配置

props: {
  showColumns: {
    type: Array,
    default: () => [],
    validator: value => value.every(item => typeof item === 'string')
  }
},
computed: {
  filteredColumns() {
    return this.columns.filter(col => 
      this.showColumns.includes(col.prop) || col.type
    )
  }
}

排序和筛选

<el-table-column
  :prop="col.prop"
  :label="col.label"
  sortable
  :filters="col.filters"
  :filter-method="col.filterMethod"
/>

性能优化技巧

使用v-if控制列的显示而非v-forv-show,避免不必要的渲染

大数据量时考虑虚拟滚动方案,可使用vue-virtual-scroller等库

复杂单元格内容使用作用域插槽时,考虑提取为单独组件

vue实现table封装

对于固定列场景,合理设置fixed属性并注意浏览器兼容性

标签: vuetable
分享给朋友:

相关文章

vue实现弹窗

vue实现弹窗

Vue 实现弹窗的常见方法 使用组件化方式封装弹窗 创建一个独立的弹窗组件(如 Modal.vue),通过 v-if 或 v-show 控制显示隐藏: <template> <…

vue 实现筛选

vue 实现筛选

实现筛选功能的基本方法 在Vue中实现筛选功能通常涉及以下几个核心步骤: 数据绑定与筛选逻辑 使用v-model绑定筛选条件到Vue实例的数据属性,结合计算属性实现动态筛选: data() {…

mvvm实现vue

mvvm实现vue

MVVM 模式在 Vue 中的实现 MVVM(Model-View-ViewModel)是一种前端架构模式,Vue 的设计灵感来源于此。以下是 MVVM 在 Vue 中的核心实现方式: 数据绑定(M…

黑马vue实现

黑马vue实现

以下是关于使用 Vue.js 实现黑马相关功能或项目的关键方法和实践指南: 环境配置与项目初始化 安装最新版 Vue CLI 或使用 Vite 创建项目: npm create vue@lates…

vue搜索功能实现

vue搜索功能实现

Vue搜索功能实现方法 在Vue中实现搜索功能可以通过多种方式完成,以下是几种常见的方法: 使用计算属性实现搜索 计算属性非常适合处理需要根据输入值动态过滤数据的情况。创建一个计算属性,根据搜索关键…

vue实现div单选

vue实现div单选

Vue 实现 div 单选 在 Vue 中实现 div 单选可以通过 v-model 结合 v-for 和事件绑定来完成。以下是具体实现方法: 模板部分 <template>…