# BaseTable
**Repository Path**: leheya/BaseTable
## Basic Information
- **Project Name**: BaseTable
- **Description**: 基于Elment Plus开源的表格组件。
- **Primary Language**: JavaScript
- **License**: MulanPSL-2.0
- **Default Branch**: master
- **Homepage**: https://gitee.com/leheya/BaseTable
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-04-05
- **Last Updated**: 2025-04-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# BaseTable 组件
## 简介
BaseTable 是一个基于 Element Plus 的表格组件,提供了丰富的功能和灵活的配置,适用于各种业务场景。它支持数据展示、分页、搜索、排序、筛选、导出等常用功能,并且可以通过简单的配置实现复杂的表格操作。
## 目录
- [功能特点](#功能特点)
- [环境要求](#环境要求)
- [快速开始](#快速开始)
- [使用方法](#使用方法)
- [属性配置](#属性配置)
- [事件](#事件)
- [列配置](#列配置)
- [插槽](#插槽)
- [扩展功能](#扩展功能)
- [常见问题](#常见问题)
## 功能特点
- ✅ 基于 Element Plus,UI 风格统一
- ✅ 支持服务端分页、排序、搜索
- ✅ 支持表格数据行展开
- ✅ 内置操作列(编辑、删除等)
- ✅ 支持导出数据为 Excel
- ✅ 支持自定义表格列渲染
- ✅ 内置搜索与重置功能
- ✅ 表格内容自适应高度
- ✅ 支持多选功能
- ✅ 支持自定义操作按钮
- ✅ 支持虚拟化数据处理
- ✅ 支持高级过滤功能
- ✅ 支持基于路由的按钮权限控制
## 环境要求
### 必备条件
- **Node.js**: v16.0.0 或更高版本
- **npm**: v7.0.0 或更高版本
### 依赖版本
- **Vue**: 3.3.4 或更高版本
- **Element Plus**: 2.4.0 或更高版本
- **TypeScript**: 5.2.2 或更高版本
- **Vite**: 4.4.9 或更高版本
### 必需插件
1. **xlsx**: 用于Excel导出功能
2. **lodash-es**: 用于高级数据处理
3. **@element-plus/icons-vue**: 提供Element Plus图标支持
## 快速开始
### 安装项目
1. **克隆项目**
```bash
git clone https://github.com/yourusername/elmentpulstable.git
cd elmentpulstable
```
2. **安装依赖**
```bash
npm install
```
3. **安装额外插件**
如果遇到缺少依赖的情况,可以手动安装以下插件:
```bash
# 安装Excel导出功能所需的依赖
npm install xlsx --save
# 安装lodash-es(防抖、节流等工具函数)
npm install lodash-es --save
# 安装Element Plus图标
npm install @element-plus/icons-vue --save
```
4. **启动开发服务器**
```bash
npm run dev
```
5. **访问应用**
打开浏览器访问: `http://localhost:5173/`
### 项目目录结构
```
src/
├── components/
│ └── BaseTable/ # 表格组件
│ ├── index.vue # 主组件
│ └── components/ # 子组件
│ ├── table/ # 表格核心
│ └── tableToolBar/ # 工具栏
├── utils/
│ └── exportUtils.ts # 导出工具
├── views/
│ └── TableDemo.vue # 使用示例
├── router/
│ └── index.ts # 路由配置
├── App.vue # 应用入口
└── main.ts # 主文件
```
## 使用方法
### 基础用法
```vue
```
### 与API集成示例
BaseTable组件可以与后端API服务无缝集成:
```vue
```
## 属性配置
| 属性名 | 说明 | 类型 | 可选值 | 默认值 |
| --- | --- | --- | --- | --- |
| table-data | 表格数据 | Array | - | [] |
| columns | 表格列配置 | Array | - | [] |
| total | 数据总条数 | Number | - | 0 |
| loading | 加载状态 | Boolean | - | false |
| page-sizes | 每页显示条数选项 | Array | - | [10, 20, 30, 50] |
| current-page | 当前页码 | Number | - | 1 |
| page-size | 每页显示条数 | Number | - | 10 |
| showOperations | 是否显示操作列 | Boolean | - | false |
| table_name | 表格名称,用于识别表格,从而进行其他的权限配置 | String | - | '' |
| expandFields | 可展开字段配置 | Array | - | [] |
| expandable | 是否可展开行 | Boolean | - | false |
| placeholder | 搜索框占位符 | String | - | '请输入关键词搜索' |
| showDatePicker | 是否显示日期选择器 | Boolean | - | false |
| selectOptions | 状态筛选选项 | Array | - | [] |
## 事件
| 事件名 | 说明 | 回调参数 |
| --- | --- | --- |
| search | 点击搜索按钮时触发 | 搜索关键词 |
| reset | 点击重置按钮时触发 | - |
| add | 点击添加按钮时触发 | - |
| edit | 点击编辑按钮时触发 | 当前行数据 |
| delete | 点击删除按钮时触发 | 当前行数据 |
| export | 点击导出按钮时触发 | - |
| print | 点击打印按钮时触发 | - |
| row-click | 行点击事件 | 当前行数据 |
| selection-change | 选择项发生变化时触发 | 已选择的行数据数组 |
| select-change | 选项卡或选择器值变化时触发 | 选中的值 |
| date-change | 日期选择器值变化时触发 | 日期范围值 |
| virtual | 高级过滤按钮点击时触发 | - |
| load-all-data | 加载全部数据时触发(用于高级筛选/虚拟模式) | {limit: number} 限制加载的最大数据条数 |
## 列配置
columns 数组中每一项的配置:
```javascript
{
prop: 'name', // 字段名
label: '姓名', // 列标题
width: 120, // 列宽度
type: 'text', // 字段类型: text, image, button, click, number, status
showOverflow: true, // 是否显示省略号
show: true, // 是否显示该列
sortable: true, // 是否可排序
formatter: Function // 格式化函数
}
```
字段类型支持以下值:
- `text`: 普通文本(默认)
- `image`: 图片,会渲染为``
- `button`: 按钮,会渲染为``
- `click`: 可点击文本
- `number`: 数字类型,空值显示为0
- `status`: 状态类型,会渲染为``
## 插槽
| 插槽名 | 说明 |
| --- | --- |
| default | 自定义表格内容 |
| empty | 自定义空数据显示内容 |
| append | 表格尾部内容 |
| expand | 展开行内容 |
| header | 表格头部内容 |
## 扩展功能
### 表格数据导出
BaseTable 组件内置了导出功能,可以将表格数据导出为 Excel 文件。
```vue
```
### 表格行展开
通过 `expandable` 和 `expandFields` 属性,可以实现表格行的展开功能。
```vue
```
### 自定义表格内容渲染
通过插槽可以自定义表格内容的渲染方式。
```vue
{{ row.name }}
```
### 高级筛选功能
点击"高级筛选"按钮启用虚拟模式,可以对表格数据进行更复杂的筛选操作。
**重要说明**:
- 高级筛选实际上是基于虚拟化表格技术实现的,它会一次性加载所有数据到前端进行处理
- 默认限制加载最多10,000条记录,超过此数量可能会影响浏览器性能
- 适用于中小型数据集,大型数据集建议使用基本的分页筛选功能
- 启用高级筛选后,表格将不再使用分页,而是显示全部数据
```vue
```
**底层实现**:
```javascript
// 在BaseTable组件中的实现
const toggleVirtualMode = () => {
isVirtualMode.value = !isVirtualMode.value
if (isVirtualMode.value) {
// 在虚拟模式下加载所有数据(最多10000条)
emit('load-all-data', { limit: 10000 })
} else {
// 切回分页模式,重新加载当前页数据
emit('search', { keyword: '', page: props.currentPage, pageSize: props.pageSize })
}
}
```
## 常见问题
### 1. 表格数据不显示
**问题描述**:配置了表格但没有数据显示。
**解决方案**:
- 确认 `tableData` 数组中有数据
- 检查控制台是否有错误信息
- 确认列配置的 `prop` 属性与数据字段匹配
- 确保在数据加载完成后将 `loading` 状态设置为 `false`
```javascript
// 正确的数据加载方式
const fetchData = () => {
loading.value = true
// 异步获取数据
setTimeout(() => {
tableData.value = [...yourData]
loading.value = false
}, 500)
}
```
### 2. 编辑按钮无法点击
**问题描述**:表格中的编辑按钮不触发事件。
**解决方案**:
- 确保路由配置中包含了 'edit' 按钮权限
- 检查是否正确实现了 `handleEdit` 方法
- 确认 `showOperations` 属性已设置为 `true`
```javascript
// router/index.ts 中的配置
{
path: '/',
component: TableDemo,
meta: {
buttons: ['add', 'edit', 'delete', 'export', 'print']
}
}
```
### 3. 高级筛选功能不工作
**问题描述**:点击高级筛选按钮没有反应。
**解决方案**:
- 确保路由配置中包含了 'virtual' 按钮权限
- 检查是否正确实现了 `handleVirtual` 方法
- 确认事件绑定正确:`@virtual="handleVirtual"`
```javascript
// 确保路由配置中包含 'virtual'
{
path: '/',
component: TableDemo,
meta: {
buttons: ['add', 'edit', 'delete', 'export', 'print', 'virtual']
}
}
```
### 4. 导出功能报错
**问题描述**:点击导出按钮时出现 "Cannot find module 'xlsx'" 错误。
**解决方案**:
- 安装 xlsx 依赖:`npm install xlsx --save`
- 确保 utils/exportUtils.ts 文件存在
- 确保正确导入 exportToExcel 函数
```javascript
// 正确的导入方式
import { exportToExcel } from '../utils/exportUtils'
const handleExport = () => {
exportToExcel(tableData.value, 'export-filename')
}
```
### 5. 浏览器兼容性问题
**问题描述**:在某些浏览器中表格功能异常。
**解决方案**:
- 确保使用现代浏览器:Chrome 80+, Firefox 72+, Safari 13+, Edge 80+
- 如果需要支持旧浏览器,请添加相应的 polyfill
### 6. 表格列宽度自适应问题
**问题描述**:表格列宽度不合理或显示异常。
**解决方案**:
- 为固定宽度的列设置明确的 `width` 属性
- 最后一列可以不设置宽度,让其自动占满剩余空间
- 对于可能内容过长的列,设置 `showOverflow: true`
```javascript
const columns = ref([
{ prop: 'id', label: 'ID', width: 80 }, // 固定宽度
{ prop: 'name', label: '姓名', width: 120 }, // 固定宽度
{ prop: 'email', label: '邮箱', width: 220, showOverflow: true }, // 内容可能长,显示省略号
{ prop: 'address', label: '地址' } // 自适应宽度
])
```
### 7. 高级筛选性能问题
**问题描述**:启用高级筛选后,浏览器变得卡顿或响应缓慢。
**解决方案**:
- 高级筛选功能会一次加载所有数据(默认上限10,000条),对于大量数据会影响性能
- 减少加载的数据量:修改 `handleLoadAllData` 方法中的 `limit` 参数
- 对于超过3,000条的数据集,建议使用普通分页模式
- 如果必须使用高级筛选,考虑在服务端实现预筛选,减少返回的数据量
```javascript
// 自定义数据加载上限
const handleVirtual = () => {
// 将上限设置为较小的值以提高性能
emit('load-all-data', { limit: 3000 })
}
```
## 浏览器兼容性
本组件已在以下浏览器进行测试:
- Chrome 80+
- Firefox 72+
- Safari 13+
- Edge 80+
不支持 Internet Explorer 11 及更早版本。
## 版本信息
- 当前版本: 0.1.0
- 最后更新: 2023-04-15
如需了解更多信息,或报告bug,请访问项目GitHub页面。
## 构建与部署
### 构建项目
项目可以使用以下命令构建生产版本:
```bash
# 不进行类型检查的构建(推荐)
npm run build
# 进行类型检查的构建(可能在某些环境下报错)
npm run build:check
```
构建后的文件会生成在 `dist` 目录下,可以部署到任何静态文件服务器。
### 常见构建问题
#### 1. vue-tsc 类型检查错误
**问题描述**:使用 `vue-tsc && vite build` 命令构建时出现以下错误:
```
Search string not found: "/supportedTSExtensions = .*(?=;)/"
```
**解决方案**:
- 使用不带类型检查的构建命令:`npm run build`
- 如果需要类型检查,可以先单独运行 `vue-tsc --noEmit`,然后再执行 `vite build`
- 更新 vue-tsc 版本:`npm install vue-tsc@latest --save-dev`
#### 2. 打包文件过大警告
**问题描述**:构建时出现文件过大的警告:
```
(!) Some chunks are larger than 500 kBs after minification.
```
**解决方案**:
- 使用动态导入拆分代码块:`import('./moduleName.js')`
- 在 vite.config.ts 中配置手动分块:
```javascript
// vite.config.ts
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks: {
'element-plus': ['element-plus'],
'lodash': ['lodash-es'],
}
}
},
chunkSizeWarningLimit: 1000, // 提高警告阈值(单位:KB)
}
})
```
### 部署建议
构建后的 BaseTable 组件可以部署到以下环境:
1. **静态文件服务器**:Nginx、Apache 等
2. **CDN 服务**:阿里云 OSS、腾讯云 COS 等
3. **页面托管服务**:GitHub Pages、Vercel、Netlify 等
部署示例(Nginx):
```nginx
server {
listen 80;
server_name your-domain.com;
location / {
root /path/to/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
}
```
日期选择器提供了便捷的快捷方式,包括"最近一周"、"最近一个月"和"最近三个月"。