超详细vxe-table入门指南:从安装到高级功能全解析
【免费下载链接】vxe-table vxe-table vue 表单/表格解决方案 项目地址: https://gitcode.com/gh_mirrors/vx/vxe-table
前言:为什么选择vxe-table?
你是否还在为Vue项目中的表格需求而烦恼?面对复杂的数据展示、编辑、排序、筛选等功能,普通表格组件往往捉襟见肘。vxe-table作为一款基于Vxe UI的PC端表格组件,提供了从基础表格到高级功能的完整解决方案,支持复制粘贴、数据透视表、高性能虚拟列表等特性,完美满足企业级应用开发需求。
读完本文,你将获得:
- vxe-table的安装与基础配置方法
- 表格的常用功能实现,如排序、筛选、分页等
- 高级特性如虚拟滚动、单元格编辑、树形表格的应用
- 实用技巧与性能优化建议
一、vxe-table简介
1.1 什么是vxe-table?
vxe-table是一个基于Vue.js的PC端表格组件,全称为Vue Extended Table,它提供了丰富的表格功能和灵活的配置选项,旨在解决复杂的表格场景需求。vxe-table的核心理念是面向现代浏览器,采用双向数据流设计,支持按需加载和自定义主题样式。
1.2 主要特性
vxe-table拥有以下核心特性:
| 特性类别 | 主要功能 |
|---|---|
| 基础功能 | 基础表格、配置式表格、斑马线条纹、多种边框、单元格样式 |
| 交互功能 | 列宽拖动、列拖拽排序、行拖拽排序、固定列、多级表头 |
| 数据处理 | 排序、多字段排序、筛选、合并单元格、导入/导出/打印 |
| 高级功能 | 虚拟滚动、树形表格、单元格编辑、数据校验、键盘导航 |
1.3 版本支持情况
vxe-table目前主要维护V4版本,基于Vue 3.2+开发,只支持现代浏览器,不支持IE。历史版本V3基于Vue 2.6~2.7,已停止维护。
1.4 浏览器兼容性
vxe-table支持以下现代浏览器:
| 浏览器 | 最低版本要求 |
|---|---|
| Chrome | 80+ |
| Firefox | 90+ |
| Edge | 80+ |
| Safari | 10+ |
| Opera | 75+ |
二、安装与环境配置
2.1 环境要求
- Vue: 3.2+
- Node.js: 14.0+
- npm/yarn: 包管理工具
2.2 安装方式
2.2.1 npm安装
npm install vxe-table --save
2.2.2 yarn安装
yarn add vxe-table
2.2.3 克隆仓库安装
git clone https://gitcode.com/gh_mirrors/vx/vxe-table.git
cd vxe-table
npm install --legacy-peer-deps
npm run lib
2.3 引入vxe-table
2.3.1 全局引入
在main.js中全局引入vxe-table:
import { createApp } from 'vue'
import App from './App.vue'
import VxeTable from 'vxe-table'
import 'vxe-table/lib/style.css'
const app = createApp(App)
app.use(VxeTable)
app.mount('#app')
2.3.2 按需引入
如果你的项目需要减小打包体积,可以按需引入所需组件:
import { createApp } from 'vue'
import App from './App.vue'
import { VxeTable, VxeColumn } from 'vxe-table'
import 'vxe-table/lib/style.css'
const app = createApp(App)
app.use(VxeTable)
app.use(VxeColumn)
app.mount('#app')
2.4 CDN引入
对于非构建环境,可以通过CDN引入vxe-table:
<!-- 引入样式 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/vxe-table@4/lib/style.css">
<!-- 引入脚本 -->
<script src="https://cdn.jsdelivr.net/npm/vue@3"></script>
<script src="https://cdn.jsdelivr.net/npm/vxe-table@4"></script>
三、基础表格实现
3.1 第一个vxe-table
下面我们来创建一个最简单的vxe-table实例:
<template>
<div>
<vxe-table :data="tableData">
<vxe-column type="seq" title="序号" width="60"></vxe-column>
<vxe-column field="name" title="姓名"></vxe-column>
<vxe-column field="role" title="角色"></vxe-column>
<vxe-column field="sex" title="性别"></vxe-column>
<vxe-column field="age" title="年龄"></vxe-column>
<vxe-column field="address" title="地址"></vxe-column>
</vxe-table>
</div>
</template>
<script setup>
import { reactive } from 'vue'
const tableData = reactive([
{ id: 10001, name: 'Test1', role: 'Develop', sex: 'Man', age: 28, address: 'Shenzhen' },
{ id: 10002, name: 'Test2', role: 'Test', sex: 'Woman', age: 22, address: 'Guangzhou' },
{ id: 10003, name: 'Test3', role: 'PM', sex: 'Man', age: 32, address: 'Shanghai' },
{ id: 10004, name: 'Test4', role: 'Designer', sex: 'Woman', age: 24, address: 'Beijing' }
])
</script>
在这个例子中,我们使用vxe-table组件创建表格,通过data属性绑定数据源。vxe-column组件定义表格列,field属性指定数据字段,title属性设置列标题。
3.2 表格属性配置
vxe-table提供了丰富的属性配置,用于自定义表格的外观和行为。下面是一些常用的表格属性:
<vxe-table
:data="tableData"
border
stripe
:height="400"
:show-header="true"
:column-config="{ resizable: true }"
>
<!-- 列定义 -->
</vxe-table>
常用表格属性说明:
| 属性名 | 类型 | 描述 |
|---|---|---|
| data | Array | 表格数据源 |
| border | Boolean/String | 是否显示边框,可选值:true/false/'full'/'outer'/'inner' |
| stripe | Boolean | 是否显示斑马纹 |
| height | Number/String | 表格高度 |
| minHeight | Number/String | 表格最小高度 |
| maxHeight | Number/String | 表格最大高度 |
| showHeader | Boolean | 是否显示表头 |
| column-config | Object | 列配置,如{ resizable: true }允许列宽调整 |
3.3 列属性配置
vxe-column也提供了丰富的属性配置:
<vxe-column
field="name"
title="姓名"
width="120"
align="center"
:show-overflow="true"
:sortable="true"
></vxe-column>
常用列属性说明:
| 属性名 | 类型 | 描述 |
|---|---|---|
| field | String | 对应数据字段名 |
| title | String | 列标题 |
| width | Number/String | 列宽度 |
| minWidth | Number/String | 列最小宽度 |
| align | String | 对齐方式,可选值:left/center/right |
| showOverflow | Boolean | 内容过长时是否显示省略号 |
| sortable | Boolean | 是否允许排序 |
| fixed | String | 是否固定列,可选值:left/right |
3.4 表格样式自定义
vxe-table提供了多种方式来自定义表格样式:
3.4.1 内置样式
通过设置表格属性,可以快速应用内置样式:
<vxe-table
:data="tableData"
border
stripe
round
size="small"
>
<!-- 列定义 -->
</vxe-table>
3.4.2 自定义单元格样式
使用cellClassName和cellStyle属性可以自定义单元格样式:
<vxe-table
:data="tableData"
:cell-class-name="cellClassName"
:cell-style="cellStyle"
>
<!-- 列定义 -->
</vxe-table>
<script>
export default {
methods: {
cellClassName({ row, column }) {
if (column.field === 'age' && row.age > 30) {
return 'highlight-row'
}
},
cellStyle({ row, column }) {
if (column.field === 'sex' && row.sex === 'Woman') {
return { color: '#ff4d4f' }
}
}
}
}
</script>
<style>
.highlight-row {
background-color: #fff2e8;
}
</style>
四、常用功能实现
4.1 排序功能
vxe-table支持单列排序和多列排序,只需在列上设置sortable属性:
<template>
<vxe-table :data="tableData">
<vxe-column type="seq" title="序号" width="60"></vxe-column>
<vxe-column field="name" title="姓名"></vxe-column>
<vxe-column field="age" title="年龄" :sortable="true"></vxe-column>
<vxe-column field="address" title="地址"></vxe-column>
</vxe-table>
</template>
对于自定义排序逻辑,可以使用sort-method属性:
<vxe-column
field="age"
title="年龄"
:sortable="true"
:sort-method="sortAge"
></vxe-column>
<script>
export default {
methods: {
sortAge(a, b) {
// 自定义排序逻辑
return a.age - b.age
}
}
}
</script>
4.2 筛选功能
vxe-table提供了多种筛选方式:
4.2.1 基础筛选
<vxe-table :data="tableData">
<vxe-column type="seq" title="序号" width="60"></vxe-column>
<vxe-column field="name" title="姓名"></vxe-column>
<vxe-column field="role" title="角色" :filters="roleFilters" :filter-multiple="true"></vxe-column>
<vxe-column field="address" title="地址"></vxe-column>
</vxe-table>
<script>
export default {
data() {
return {
roleFilters: [
{ label: 'Develop', value: 'Develop' },
{ label: 'Test', value: 'Test' },
{ label: 'PM', value: 'PM' },
{ label: 'Designer', value: 'Designer' }
]
}
}
}
</script>
4.2.2 自定义筛选
对于复杂的筛选需求,可以使用自定义筛选:
<vxe-column
field="age"
title="年龄"
:filters="[{ data: 'custom' }]"
:filter-render="{
name: 'ElInput',
props: { type: 'number', placeholder: '请输入年龄' },
events: {
input: filterAge
}
}"
></vxe-column>
<script>
export default {
methods: {
filterAge({ $event, column }) {
const value = $event.target.value
column.dataFilter = value ? (row) => row.age >= value : null
this.$refs.xTable.refreshFilter()
}
}
}
</script>
4.3 分页功能
vxe-table可以与分页组件配合使用,实现分页功能:
<template>
<div>
<vxe-table
ref="xTable"
:data="tableData"
:loading="loading"
>
<!-- 列定义 -->
</vxe-table>
<vxe-pager
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:total="total"
@change="handlePageChange"
></vxe-pager>
</div>
</template>
<script>
export default {
data() {
return {
tableData: [],
loading: false,
currentPage: 1,
pageSize: 10,
total: 0
}
},
created() {
this.loadData()
},
methods: {
loadData() {
this.loading = true
// 模拟API请求
setTimeout(() => {
// 实际项目中这里会是API请求
this.tableData = [...]; // 分页数据
this.total = 100; // 总条数
this.loading = false
}, 500)
},
handlePageChange() {
this.loadData()
}
}
}
</script>
4.4 单元格编辑
vxe-table支持多种编辑模式,包括单元格编辑、行编辑等。
4.4.1 单元格编辑
<template>
<vxe-table
:data="tableData"
:edit-config="{ trigger: 'click', mode: 'cell' }"
>
<vxe-column type="seq" title="序号" width="60"></vxe-column>
<vxe-column field="name" title="姓名"></vxe-column>
<vxe-column field="age" title="年龄" :edit-render="{ name: 'input', props: { type: 'number' } }"></vxe-column>
<vxe-column field="address" title="地址" :edit-render="{ name: 'input' }"></vxe-column>
</vxe-table>
</template>
4.4.2 编辑校验
可以为编辑字段添加校验规则:
<vxe-column
field="age"
title="年龄"
:edit-render="{ name: 'input', props: { type: 'number' } }"
:edit-rules="[{ required: true, type: 'number', min: 18, max: 60, message: '年龄必须在18-60之间' }]"
></vxe-column>
4.5 合并单元格
vxe-table支持合并行和列,可以通过span-method实现:
<template>
<vxe-table
:data="tableData"
:span-method="spanMethod"
>
<!-- 列定义 -->
</vxe-table>
</template>
<script>
export default {
methods: {
spanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 0 && rowIndex % 2 === 0) {
return { rowspan: 2, colspan: 1 }
} else if (columnIndex === 0 && rowIndex % 2 === 1) {
return { rowspan: 0, colspan: 0 }
}
}
}
}
</script>
五、高级功能应用
5.1 虚拟滚动
当表格数据量很大时(例如10万+行),普通表格会出现性能问题。vxe-table的虚拟滚动功能可以解决这个问题,只渲染可视区域的行:
<template>
<vxe-table
:data="tableData"
:virtual-y-config="{ itemSize: 50 }"
height="500"
>
<!-- 列定义 -->
</vxe-table>
</template>
virtual-y-config用于配置纵向虚拟滚动,itemSize指定每行的高度。同样,virtual-x-config可以配置横向虚拟滚动。
5.2 树形表格
vxe-table支持树形数据展示,只需简单配置即可实现:
<template>
<vxe-table
:data="treeData"
:tree-config="{ children: 'children', hasChild: 'hasChild' }"
>
<vxe-column type="seq" title="序号" width="60"></vxe-column>
<vxe-column field="name" title="名称"></vxe-column>
<vxe-column field="size" title="大小"></vxe-column>
<vxe-column field="date" title="修改日期"></vxe-column>
</vxe-table>
</template>
<script>
export default {
data() {
return {
treeData: [
{
id: 10000,
name: '文档',
size: '',
date: '2023-01-01',
hasChild: true,
children: [
{ id: 10001, name: '简历.docx', size: '20KB', date: '2023-01-01' },
{ id: 10002, name: '报告.pdf', size: '100KB', date: '2023-01-02' }
]
},
// 更多数据...
]
}
}
}
</script>
5.3 导出功能
vxe-table支持将表格数据导出为Excel、CSV等格式:
<template>
<div>
<vxe-toolbar>
<template #buttons>
<vxe-button @click="exportData">导出Excel</vxe-button>
</template>
</vxe-toolbar>
<vxe-table
ref="xTable"
:data="tableData"
>
<!-- 列定义 -->
</vxe-table>
</div>
</template>
<script>
export default {
methods: {
exportData() {
this.$refs.xTable.exportData({
filename: '表格数据',
type: 'xlsx',
columns: ['name', 'age', 'sex', 'address']
})
}
}
}
</script>
5.4 导入功能
vxe-table也支持从Excel导入数据:
<template>
<div>
<vxe-toolbar>
<template #buttons>
<vxe-upload
accept=".xlsx, .xls"
@change="importData"
>
<vxe-button>导入Excel</vxe-button>
</vxe-upload>
</template>
</vxe-toolbar>
<vxe-table
ref="xTable"
:data="tableData"
>
<!-- 列定义 -->
</vxe-table>
</div>
</template>
<script>
import XLSX from 'xlsx'
export default {
methods: {
importData(file) {
const reader = new FileReader()
reader.onload = (e) => {
const data = new Uint8Array(e.target.result)
const workbook = XLSX.read(data, { type: 'array' })
const firstSheetName = workbook.SheetNames[0]
const worksheet = workbook.Sheets[firstSheetName]
const jsonData = XLSX.utils.sheet_to_json(worksheet)
this.tableData = jsonData
}
reader.readAsArrayBuffer(file.raw)
}
}
}
</script>
5.5 快捷菜单
vxe-table支持自定义快捷菜单:
<template>
<vxe-table
:data="tableData"
:menu-config="{ enabled: true, body: { options: menuOptions } }"
@menu-click="handleMenuClick"
>
<!-- 列定义 -->
</vxe-table>
</template>
<script>
export default {
data() {
return {
menuOptions: [
{ code: 'copy', name: '复制' },
{ code: 'edit', name: '编辑' },
{ code: 'delete', name: '删除', disabled: ({ row }) => row.id === 1 },
{ code: 'sep1', type: 'separator' },
{ code: 'export', name: '导出选中行' }
]
}
},
methods: {
handleMenuClick({ code, row }) {
switch (code) {
case 'copy':
// 复制逻辑
break
case 'edit':
// 编辑逻辑
break
case 'delete':
// 删除逻辑
break
case 'export':
// 导出逻辑
break
}
}
}
}
</script>
六、性能优化
6.1 大数据优化
除了前面提到的虚拟滚动,还有一些优化大数据表格性能的方法:
- 使用
row-config.useKey和column-config.useKey启用key优化 - 关闭不必要的动画效果
- 使用
keepSource属性保持原始数据,避免数据拷贝 - 减少复杂的单元格渲染
<vxe-table
:data="bigData"
:row-config="{ useKey: true, keyField: 'id' }"
:column-config="{ useKey: true }"
:keep-source="true"
:animat="false"
:virtual-y-config="{ itemSize: 50 }"
>
<!-- 列定义 -->
</vxe-table>
6.2 懒加载
对于非常大的数据集,可以使用懒加载:
<template>
<vxe-table
:data="tableData"
:loading="loading"
@scroll="handleScroll"
>
<!-- 列定义 -->
</vxe-table>
</template>
<script>
export default {
data() {
return {
tableData: [],
loading: false,
currentPage: 1,
pageSize: 50,
hasMore: true
}
},
created() {
this.loadMoreData()
},
methods: {
loadMoreData() {
if (!this.hasMore) return
this.loading = true
// 模拟API请求
setTimeout(() => {
// 实际项目中这里会是API请求
const newData = [...]; // 加载的新数据
this.tableData = [...this.tableData, ...newData]
this.currentPage++
this.hasMore = newData.length === this.pageSize
this.loading = false
}, 500)
},
handleScroll({ scrollTop, scrollHeight, clientHeight }) {
// 滚动到底部时加载更多
if (scrollTop + clientHeight >= scrollHeight - 10 && !this.loading) {
this.loadMoreData()
}
}
}
}
</script>
6.3 事件防抖
对于频繁触发的事件(如输入筛选),可以使用防抖优化:
<template>
<vxe-table
:data="tableData"
>
<vxe-column
field="name"
title="姓名"
:filter-render="{
name: 'ElInput',
props: { placeholder: '输入姓名筛选' },
events: { input: debounceFilterName }
}"
></vxe-column>
<!-- 其他列 -->
</vxe-table>
</template>
<script>
import { debounce } from 'lodash'
export default {
created() {
this.debounceFilterName = debounce(this.filterName, 300)
},
methods: {
filterName({ $event, column }) {
const value = $event.target.value
column.dataFilter = value ? row => row.name.includes(value) : null
this.$refs.xTable.refreshFilter()
}
}
}
</script>
七、实战案例
7.1 复杂表格综合示例
下面是一个综合运用了多种功能的复杂表格示例:
<template>
<div>
<vxe-toolbar>
<template #buttons>
<vxe-button @click="addRow">新增</vxe-button>
<vxe-button @click="deleteSelectedRows" :disabled="selectedRows.length === 0">删除选中</vxe-button>
<vxe-button @click="exportData">导出</vxe-button>
</template>
<template #search>
<vxe-input
v-model="searchText"
placeholder="输入关键词搜索"
@input="debounceSearch"
></vxe-input>
</template>
</vxe-toolbar>
<vxe-table
ref="xTable"
:data="tableData"
:loading="loading"
border
stripe
:height="500"
:checkbox-config="{ checkRowKeys: selectedRowKeys }"
:edit-config="{ trigger: 'click', mode: 'cell', showStatus: true }"
:virtual-y-config="{ itemSize: 50 }"
@checkbox-change="handleCheckboxChange"
>
<vxe-column type="checkbox" width="60"></vxe-column>
<vxe-column type="seq" title="序号" width="60"></vxe-column>
<vxe-column field="name" title="姓名" :edit-render="{ name: 'input' }"></vxe-column>
<vxe-column field="sex" title="性别" :edit-render="{ name: 'select', options: sexOptions }"></vxe-column>
<vxe-column field="age" title="年龄" :edit-render="{ name: 'input', props: { type: 'number' } }" :sortable="true"></vxe-column>
<vxe-column field="role" title="角色" :filters="roleFilters" :filter-multiple="true"></vxe-column>
<vxe-column field="address" title="地址" :show-overflow="true"></vxe-column>
<vxe-column field="date" title="日期" :edit-render="{ name: 'datePicker', props: { type: 'date' } }"></vxe-column>
<vxe-column title="操作" width="120" align="center">
<template #default="{ row }">
<vxe-button size="small" @click="editRow(row)">编辑</vxe-button>
<vxe-button size="small" type="danger" @click="deleteRow(row)">删除</vxe-button>
</template>
</vxe-column>
</vxe-table>
<vxe-pager
v-model:current-page="currentPage"
v-model:page-size="pageSize"
:total="total"
@change="handlePageChange"
></vxe-pager>
</div>
</template>
<script>
import { ref, reactive, toRefs, onMounted } from 'vue'
import { debounce } from 'lodash'
export default {
setup() {
const state = reactive({
tableData: [],
loading: false,
searchText: '',
selectedRowKeys: [],
selectedRows: [],
currentPage: 1,
pageSize: 10,
total: 0,
sexOptions: [
{ label: '男', value: 'Man' },
{ label: '女', value: 'Woman' }
],
roleFilters: [
{ label: 'Develop', value: 'Develop' },
{ label: 'Test', value: 'Test' },
{ label: 'PM', value: 'PM' },
{ label: 'Designer', value: 'Designer' }
]
})
// 防抖搜索
const debounceSearch = debounce(() => {
state.currentPage = 1
loadData()
}, 300)
// 加载数据
const loadData = () => {
state.loading = true
// 模拟API请求
setTimeout(() => {
// 实际项目中这里会是API请求
state.tableData = [...]; // 表格数据
state.total = 100; // 总条数
state.loading = false
}, 500)
}
// 分页变更
const handlePageChange = () => {
loadData()
}
// 复选框变更
const handleCheckboxChange = ({ checked, records }) => {
state.selectedRowKeys = checked
state.selectedRows = records
}
// 新增行
const addRow = () => {
const newRow = {
id: Date.now(),
name: '',
sex: 'Man',
age: 25,
role: 'Develop',
address: '',
date: new Date().toISOString().split('T')[0]
}
state.tableData.unshift(newRow)
// 进入编辑状态
setTimeout(() => {
state.$refs.xTable.setActiveCell({ row: newRow, column: { field: 'name' } })
}, 10)
}
// 编辑行
const editRow = (row) => {
state.$refs.xTable.setActiveCell({ row, column: { field: 'name' } })
}
// 删除行
const deleteRow = (row) => {
const index = state.tableData.indexOf(row)
state.tableData.splice(index, 1)
}
// 删除选中行
const deleteSelectedRows = () => {
state.tableData = state.tableData.filter(row => !state.selectedRowKeys.includes(row.id))
state.selectedRowKeys = []
state.selectedRows = []
}
// 导出数据
const exportData = () => {
state.$refs.xTable.exportData({
filename: '员工信息表',
type: 'xlsx'
})
}
onMounted(() => {
loadData()
})
return {
...toRefs(state),
debounceSearch,
handlePageChange,
handleCheckboxChange,
addRow,
editRow,
deleteRow,
deleteSelectedRows,
exportData
}
}
}
</script>
八、总结与展望
8.1 主要功能回顾
本文详细介绍了vxe-table的安装配置、基础使用和高级功能,包括:
- 安装与引入vxe-table的多种方式
- 基础表格的创建和样式自定义
- 常用功能如排序、筛选、分页、编辑等的实现
- 高级特性如虚拟滚动、树形表格、导入导出等的应用
- 性能优化技巧和实战案例
8.2 最佳实践建议
在使用vxe-table时,建议遵循以下最佳实践:
- 根据数据量选择合适的渲染模式,大数据集使用虚拟滚动
- 合理使用缓存和懒加载,减少不必要的渲染
- 对频繁触发的事件使用防抖/节流优化
- 按需引入组件,减小打包体积
- 遵循组件化思想,将复杂表格拆分为多个组件
8.3 未来展望
vxe-table团队正在不断优化和扩展功能,未来将重点提升虚拟渲染性能,支持千万级数据渲染,并增加数据图表可视化功能。作为开发者,我们可以期待vxe-table在企业级应用开发中发挥更大作用。
vxe-table作为一款功能强大、性能优异的Vue表格组件,为我们解决复杂表格需求提供了完整的解决方案。希望本文能帮助你更好地理解和使用vxe-table,提升开发效率和用户体验。
【免费下载链接】vxe-table vxe-table vue 表单/表格解决方案 项目地址: https://gitcode.com/gh_mirrors/vx/vxe-table
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



