# edit-table
**Repository Path**: tjs/edit-table
## Basic Information
- **Project Name**: edit-table
- **Description**: 这是一个基于 Element Plus el-table 封装的轻量级可编辑表格组件,提供开箱即用的表格编辑能力。
- **Primary Language**: JavaScript
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: https://gitee.com/tjs/edit-table
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2026-06-22
- **Last Updated**: 2026-07-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# EditTable
基于 Element Plus `el-table` 封装的轻量级可编辑表格组件,提供开箱即用的表格编辑能力。
## ✨ 功能特色
- 🎯 **便捷的编辑方式**:支持点击/双击/手动三种编辑触发模式
- 📦 **丰富的编辑组件**:内置支持 Input、Select、DatePicker、Switch、Checkbox 等多种编辑器
- ✅ **强大的校验功能**:支持同步/异步校验规则,支持自定义校验函数
- 🔄 **智能状态管理**:自动追踪数据变更,支持回滚、获取变更记录
- 🎨 **灵活的插槽机制**:支持自定义单元格显示和编辑组件
## 📦 安装
```bash
# 使用 pnpm
pnpm add @tjs524/edit-table
# 使用 npm
npm install @tjs524/edit-table
# 使用 yarn
yarn add @tjs524/edit-table
```
## 🔧 注册
### 全局注册
```typescript
import { createApp } from 'vue'
import App from './App.vue'
import EditTable from '@tjs524/edit-table'
const app = createApp(App)
app.use(EditTable)
app.mount('#app')
```
### 局部注册
```vue
```
## 📖 基础用法
### 使用 EditColumn 插槽配置
```vue
```
## 🎯 EditTable Props
| 参数 | 类型 | 默认值 | 说明 |
| --------------- | ----------------------------------- | ------------ | -------- |
| data | `TableRow[]` | `[]` | 表格数据 |
| editable | `boolean` | `true` | 是否可编辑 |
| editTrigger | `'click' \| 'dblclick' \| 'manual'` | `'click'` | 编辑触发方式 |
| editTriggerMode | `'cell' \| 'row'` | `'cell'` | 编辑触发范围 |
| showIndex | `boolean` | `false` | 是否显示序号列 |
| selectMode | `'single' \| 'multiple'` | `'multiple'` | 选择模式 |
| rowKey | `string` | `-` | 行唯一标识字段名 |
| maxHeight | `number \| string` | `-` | 最大显示高度 |
| stripe | `boolean` | `false` | 斑马纹 |
| border | `boolean \| 'outer' \| 'inner'` | `false` | 边框 |
| rowClassName | `string \| Function` | `-` | 行类名 |
| onError | `Function` | `-` | 全局错误回调 |
## 🎯 EditColumn Props
| 参数 | 类型 | 默认值 | 说明 |
| ---------- | ------------------------------- | ------- | ----------- |
| type | `'checkbox' \| 'seq'` | `-` | 列类型 |
| field | `string` | `-` | 列标识(对应数据字段) |
| title | `string` | `-` | 列标题 |
| width | `number \| string` | `-` | 列宽度 |
| minWidth | `number \| string` | `-` | 最小列宽 |
| align | `'left' \| 'center' \| 'right'` | `-` | 对齐方式 |
| editRender | `EditRenderConfig` | `-` | 编辑渲染配置 |
| editRules | `ValidationRule[]` | `-` | 校验规则 |
| sortable | `boolean` | `false` | 是否可排序 |
| filterable | `boolean` | `false` | 是否可筛选 |
| fixed | `'left' \| 'right' \| boolean` | `-` | 固定列 |
## 🎨 EditRenderConfig 配置
编辑渲染配置用于指定单元格使用的编辑器类型及相关参数。
| 属性 | 类型 | 说明 |
| ------- | --------------------------------- | --------------------- |
| name | `EditorName` | 编辑器名称 |
| attrs | `Record` | 传递给编辑器的属性 |
| options | `{ label: string; value: any }[]` | 下拉选项(select/radio 类型) |
### 支持的编辑器类型
| name 值 | 对应组件 | 说明 |
| --------------- | ------------------- | ----- |
| `elInput` | `ElInput` | 文本输入框 |
| `elInputNumber` | `ElInputNumber` | 数字输入框 |
| `elSelect` | `ElSelect` | 下拉选择器 |
| `elDatePicker` | `ElDatePicker` | 日期选择器 |
| `elTimePicker` | `ElTimePicker` | 时间选择器 |
| `elSwitch` | `ElSwitch` | 开关 |
| `elCheckbox` | `ElCheckbox` | 复选框 |
| `elRadio` | `ElRadioGroup` | 单选框 |
| `elTextarea` | `ElInput(textarea)` | 文本域 |
### EditRenderConfig 示例
```typescript
// 文本输入
{ name: 'elInput', attrs: { placeholder: '请输入' } }
// 数字输入
{ name: 'elInputNumber', attrs: { min: 0, max: 100 } }
// 下拉选择
{
name: 'elSelect',
options: [
{ label: '选项1', value: '1' },
{ label: '选项2', value: '2' }
]
}
// 日期选择
{ name: 'elDatePicker', attrs: { type: 'date' } }
```
## ✅ ValidationRule 校验规则
| 属性 | 类型 | 说明 |
| -------------- | ------------------------------------------ | --------- |
| required | `boolean` | 是否必填 |
| minLength | `number` | 最小长度 |
| maxLength | `number` | 最大长度 |
| min | `number` | 最小值(数字类型) |
| max | `number` | 最大值(数字类型) |
| pattern | `RegExp \| string` | 正则表达式 |
| validator | `Function` | 自定义同步校验函数 |
| asyncValidator | `Function` | 自定义异步校验函数 |
| trigger | `'blur' \| 'change' \| ['blur', 'change']` | 校验触发时机 |
| message | `string` | 校验失败提示信息 |
### 校验规则示例
```typescript
const editRules = [
{ required: true, message: '必填项', trigger: 'blur' },
{ minLength: 2, maxLength: 20, message: '长度2-20字符', trigger: 'blur' },
{ pattern: /^[a-zA-Z]+$/, message: '只能输入字母', trigger: 'change' },
{
validator: (value, row) => {
if (value < 18) return '年龄必须大于18'
return true
},
trigger: 'blur'
},
{
asyncValidator: async (value) => {
const exists = await checkExists(value)
return exists ? '已存在' : true
},
trigger: 'blur'
}
]
```
## 📡 事件
| 事件名 | 说明 | 参数 |
| ----------------- | -------------- | -------------------- |
| edit-change | 单元格值变更时触发 | `EditChangeParams` |
| cell-click | 单元格点击时触发 | `CellClickParams` |
| cell-dblclick | 单元格双击时触发 | `CellDblClickParams` |
| edit-start | 开始编辑时触发 | `EditStartParams` |
| edit-end | 编辑结束时触发 | `EditEndParams` |
| row-insert | 插入行时触发 | `RowInsertParams` |
| before-row-insert | 插入行前触发(可拦截) | `RowInsertParams` |
| row-remove | 删除行时触发 | `RowRemoveParams` |
| row-delete | 删除行时触发(包含原始数据) | `RowDeleteParams` |
| selection-change | 选中状态变更时触发 | `TableRow[]` |
| sort-change | 排序变更时触发 | `SortChangeParams` |
## 🔌 方法(Ref API)
通过 `ref` 调用组件方法:
```vue
```
### 方法列表
| 方法名 | 说明 | 参数 | 返回值 |
| ----------------- | --------- | --------------------------------- | -------------------------------- |
| getData | 获取当前数据 | - | `TableRow[]` |
| setData | 设置数据 | `data: TableRow[]` | `void` |
| getEditRecords | 获取所有变更记录 | - | `EditRecordResult` |
| getNewRecords | 获取新增记录 | - | `TableRow[]` |
| getUpdateRecords | 获取更新记录 | - | `TableRow[]` |
| getRemoveRecords | 获取删除记录 | - | `TableRow[]` |
| getRemovedRows | 获取已删除的原始行 | - | `TableRow[]` |
| validateAll | 执行全量校验 | - | `Promise` |
| clearEdit | 清除编辑状态 | - | `void` |
| revertEdit | 回滚所有编辑 | - | `void` |
| insertRow | 插入行 | `row: TableRow, index?: number` | `void` |
| removeRow | 删除行 | `index: number \| number[]` | `void` |
| restoreRow | 恢复已删除的行 | `rows: TableRow \| TableRow[]` | `void` |
| getSelectedRows | 获取选中行 | - | `TableRow[]` |
| scrollToRow | 滚动到指定行 | `index: number` | `void` |
| scrollToColumn | 滚动到指定列 | `prop: string` | `void` |
| startCellEdit | 手动开启编辑 | `rowIndex: number, prop: string` | `void` |
| endCellEdit | 手动关闭编辑 | `rowIndex: number, prop: string` | `void` |
| endAllEdit | 关闭所有编辑 | - | `void` |
| getCellValidation | 获取单元格校验状态 | `rowIndex: number, field: string` | `{ valid, errors }` |
## 🧩 插槽
| 插槽名 | 说明 | 作用域参数 |
| ------- | ----------------- | ----------------------------------------------- |
| default | 放置 EditColumn 子组件 | - |
| cell | 自定义单元格显示内容 | `row, column, cellValue, rowIndex, columnIndex` |
| edit | 自定义编辑组件 | `row, column, rowIndex, columnIndex` |
| header | 自定义列标题 | `column` |
| empty | 自定义空数据展示 | - |
### 插槽使用示例
```vue
{{ cellValue }}
```
## 🔄 变更追踪
组件内置变更追踪功能,可方便地获取新增、更新、删除的记录:
```typescript
const records = tableRef.value?.getEditRecords()
// 所有变更记录
console.log(records.editRecords)
// 新增记录
console.log(records.newRecords)
// 更新记录
console.log(records.updateRecords)
// 删除记录
console.log(records.removeRecords)
```
## ✅ 数据校验
```typescript
// 全量校验
const result = await tableRef.value?.validateAll()
if (result.valid) {
// 校验通过,提交数据
submitData()
} else {
// 显示错误信息
console.log(result.errors)
}
// 获取单个单元格校验状态
const cellValidation = tableRef.value?.getCellValidation(rowIndex, 'fieldName')
if (!cellValidation.valid) {
console.log(cellValidation.errors)
}
```
## 🔧 完整 CRUD 示例
```vue
```
## 📝 类型导出
组件导出以下 TypeScript 类型,可用于类型声明:
```typescript
import type {
TableRow,
TableColumn,
EditTableProps,
EditTableInstance,
EditRenderConfig,
ValidationRule,
EditorName,
EditTrigger,
EditRecord,
EditRecordResult,
ValidationError,
} from '@tjs524/edit-table'
```
## 🚀 npm 发布流程
项目使用 Changesets 管理版本和发布记录。
### 记录变更
开发完成后先执行:
```bash
pnpm changeset
```
按提示选择版本类型并填写变更说明。
### 更新版本与 Changelog
发布前执行:
```bash
pnpm version:npm
```
该命令会根据 `.changeset` 记录更新 `package.json` 版本号,并生成或更新 `CHANGELOG.md`。
### 验证发布
正式发布前可先执行 dry-run,该命令使用 `pnpm publish --dry-run` 预检打包和发布配置,不会上传 npm:
```bash
pnpm release:npm:dry
```
### 正式发布
确认版本和构建产物无误后执行:
```bash
pnpm release:npm
```
该命令会依次执行代码检查、单元测试、生产构建,并由 `publishConfig.registry` 指定通过 `https://registry.npmjs.org/` 发布到官方 npm。
## 📄 许可证
Apache License 2.0
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
## 📧 联系方式
如有问题或建议,欢迎提交 Issue 或发送邮件。