Skip to content

Table 表格组件

基于 VXE Table 封装的表格组件,支持列宽缓存、自定义列、分页等功能。

注意事项

本组件基于 VXE Table 封装,如需了解更多高级功能,请参考官方文档。

基础用法

::: demo

vue
<template>
  <div>
    <by-table
      :grid-options="gridOptions"
      name="demo-table"
      :loading="loading"
      @page-change="handlePageChange"
      @current-change="handleCurrentChange"
    />
  </div>
</template>

<script setup>
import { ref, reactive } from 'vue'

const loading = ref(false)

const gridOptions = reactive({
  columns: [
    { field: 'name', title: '姓名', width: 120 },
    { field: 'age', title: '年龄', width: 80 },
    { field: 'email', title: '邮箱', width: 200 },
    { field: 'address', title: '地址', width: 300 },
    { field: 'phone', title: '电话', width: 150 },
  ],
  data: [
    { name: '张三', age: 25, email: 'zhangsan@example.com', address: '北京市朝阳区', phone: '13800138001' },
    { name: '李四', age: 30, email: 'lisi@example.com', address: '上海市浦东新区', phone: '13800138002' },
    { name: '王五', age: 28, email: 'wangwu@example.com', address: '广州市天河区', phone: '13800138003' },
  ],
  pagerConfig: {
    currentPage: 1,
    pageSize: 10,
    total: 100,
  },
})

const handlePageChange = (pager) => {
  console.log('分页变化:', pager)
}

const handleCurrentChange = (row) => {
  console.log('当前行变化:', row)
}
</script>

:::

可编辑表格

::: demo

vue
<template>
  <div>
    <by-table :grid-options="gridOptions" name="editable-table" :loading="loading" @edit-closed="handleEditClosed" />
  </div>
</template>

<script setup>
import { ref, reactive } from 'vue'

const loading = ref(false)

const gridOptions = reactive({
  columns: [
    { field: 'name', title: '姓名', width: 120, editRender: { name: 'input' } },
    { field: 'age', title: '年龄', width: 80, editRender: { name: 'input', attrs: { type: 'number' } } },
    { field: 'email', title: '邮箱', width: 200, editRender: { name: 'input' } },
    {
      field: 'status',
      title: '状态',
      width: 100,
      editRender: {
        name: 'select',
        options: [
          { label: '启用', value: 'active' },
          { label: '禁用', value: 'inactive' },
        ],
      },
    },
  ],
  data: [
    { name: '张三', age: 25, email: 'zhangsan@example.com', status: 'active' },
    { name: '李四', age: 30, email: 'lisi@example.com', status: 'inactive' },
  ],
  editConfig: {
    trigger: 'click',
    mode: 'cell',
  },
})

const handleEditClosed = (params) => {
  console.log('编辑完成:', params)
}
</script>

:::

自定义列宽缓存

::: demo

vue
<template>
  <div>
    <el-button @click="resetColumns" v-if="showReset">重置列宽</el-button>
    <by-table :grid-options="gridOptions" name="cache-table" :loading="loading" @set-columns="handleSetColumns" />
  </div>
</template>

<script setup>
import { ref, reactive } from 'vue'

const loading = ref(false)
const showReset = ref(false)

const gridOptions = reactive({
  columns: [
    { field: 'id', title: 'ID', width: 80 },
    { field: 'name', title: '姓名', width: 120 },
    { field: 'department', title: '部门', width: 150 },
    { field: 'position', title: '职位', width: 120 },
    { field: 'salary', title: '薪资', width: 100 },
    { field: 'email', title: '邮箱', width: 200 },
    { field: 'phone', title: '电话', width: 150 },
    { field: 'address', title: '地址', width: 300 },
  ],
  data: [
    {
      id: 1,
      name: '张三',
      department: '技术部',
      position: '前端工程师',
      salary: '15000',
      email: 'zhangsan@example.com',
      phone: '13800138001',
      address: '北京市朝阳区',
    },
    {
      id: 2,
      name: '李四',
      department: '产品部',
      position: '产品经理',
      salary: '20000',
      email: 'lisi@example.com',
      phone: '13800138002',
      address: '上海市浦东新区',
    },
  ],
})

const handleSetColumns = (columns) => {
  console.log('列配置变化:', columns)
}

const resetColumns = () => {
  // 重置列宽缓存
  showReset.value = false
}
</script>

:::

排序和筛选

::: demo

vue
<template>
  <div>
    <by-table
      :grid-options="gridOptions"
      name="sort-filter-table"
      :loading="loading"
      @sort-change="handleSortChange"
      @filter-change="handleFilterChange"
    />
  </div>
</template>

<script setup>
import { ref, reactive } from 'vue'

const loading = ref(false)

const gridOptions = reactive({
  columns: [
    { field: 'name', title: '姓名', width: 120, sortable: true },
    { field: 'age', title: '年龄', width: 80, sortable: true },
    {
      field: 'department',
      title: '部门',
      width: 150,
      filters: [
        { label: '技术部', value: 'tech' },
        { label: '产品部', value: 'product' },
        { label: '设计部', value: 'design' },
      ],
      filterMethod: 'is',
    },
    { field: 'salary', title: '薪资', width: 100, sortable: true },
  ],
  data: [
    { name: '张三', age: 25, department: 'tech', salary: 15000 },
    { name: '李四', age: 30, department: 'product', salary: 20000 },
    { name: '王五', age: 28, department: 'design', salary: 18000 },
  ],
})

const handleSortChange = (params) => {
  console.log('排序变化:', params)
}

const handleFilterChange = (params) => {
  console.log('筛选变化:', params)
}
</script>

:::

API

Props

参数说明类型默认值
gridOptions表格配置选项object-
name表格名称,用于列宽缓存string''
autoHeight是否自动高度booleanfalse
loading是否显示加载状态booleanfalse

Events

事件名说明回调参数
pageChange分页变化时触发(pager: object)
currentChange当前行变化时触发(row: object)
sortChange排序变化时触发(params: object)
filterChange筛选变化时触发(params: object)
editClosed编辑完成时触发(params: object)
setColumns列配置变化时触发(columns: array)
setGroupColumn分组列变化时触发(columns: array)

gridOptions 配置

属性说明类型默认值
columns列配置array[]
data表格数据array[]
pagerConfig分页配置object-
editConfig编辑配置object-
sortConfig排序配置object{ remote: true, trigger: 'cell' }
rowConfig行配置object{ height: 41, isHover: true }
columnConfig列配置object{ resizable: true }
resizableConfig列宽调整配置object{ minWidth: 50 }

列配置 (columns)

属性说明类型默认值
field字段名string-
title列标题string-
width列宽度number-
sortable是否可排序booleanfalse
filters筛选选项array-
filterMethod筛选方法string-
editRender编辑渲染器object-
fixed是否固定列string-
align对齐方式string'center'

Released under the MIT License.