@eclou/e-table 是一个基于 Vue 3 + Element Plus 的 CRUD 表格组件,内置:
- 列表查询 + 分页 + 排序
- 新增/编辑弹窗
- 删除确认
- 过滤区、工具栏、操作列、表单槽位扩展
npm i @eclou/e-table element-plus axiosimport { createApp } from 'vue'
import ElementPlus from 'element-plus'
import { ETablePlugin } from '@eclou/e-table'
import 'element-plus/dist/index.css'
const app = createApp(App)
app.use(ElementPlus)
app.use(ETablePlugin)
app.mount('#app')<script setup lang="ts">
import { ETable } from '@eclou/e-table'
</script>列表请求(listUrl)默认按以下结构读取数据:
{
"code": 0,
"message": "ok",
"data": {
"count": 100,
"page": 1,
"data": []
}
}data.data 会作为表格数据,data.count 用于分页总数。
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
pk |
string |
"_id" |
主键字段名,删除时会用到 |
page |
number |
1 |
当前版本未直接使用 |
row |
number |
10 |
每页条数 |
query |
object |
{} |
固定查询参数,会和过滤条件合并 |
initFilter |
object |
{} |
初始过滤条件 |
layout |
string |
"prev, pager, next" |
分页布局,透传给 el-pagination |
defualtFilter |
boolean |
true |
是否显示默认过滤区(字段名按源码拼写) |
defaultAction |
boolean |
true |
是否显示默认操作列 |
defaultEdit |
boolean |
true |
是否显示默认编辑按钮 |
defaultDelete |
boolean |
true |
是否显示默认删除按钮 |
listUrl |
string |
- | 列表接口地址(必填) |
addUrl |
string |
- | 新增提交地址 |
submitUrl |
string |
- | 编辑提交地址 |
deleteUrl |
string |
- | 删除接口地址 |
filterLazy |
number |
600 |
过滤防抖毫秒数 |
noticeFiled |
string |
"" |
删除确认文案展示字段(字段名按源码拼写) |
requestMethod |
object |
{ addUrl:'POST', submitUrl:'POST', deleteUrl:'POST' } |
各接口请求方法 |
formFullScreen |
boolean |
false |
表单弹窗是否全屏 |
axios |
AxiosInstance |
null |
自定义请求实例,不传则内部创建实例 |
| 事件名 | 回调参数 | 用途 |
|---|---|---|
beforeFilter |
(params) |
列表请求前触发 |
afterFilter |
(res, setItems) |
列表成功后触发,可二次处理列表 |
beforeAdd |
(form, setForm) |
打开新增弹窗前初始化表单 |
beforeEdit |
(form, setForm) |
打开编辑弹窗前处理表单 |
beforeSubmit |
(submitForm, next) |
提交前改写数据或中断提交 |
afterSubmit |
(errors) |
提交后触发(成功/失败都会触发) |
afterDelete |
(data, success) |
删除请求完成后触发 |
beforeSubmit 中的 next 用法:
next(true):中断提交next(newFormObject):替换提交数据
可通过 ref 调用:
| 名称 | 类型 | 说明 |
|---|---|---|
fetchList |
() => void |
手动刷新列表 |
submit |
() => void |
手动触发表单提交 |
clear |
() => void |
清空过滤并重置列表 |
initFormValue |
(formValue) => void |
批量设置表单值 |
items |
Ref<any[]> |
当前表格数据 |
formRef |
Ref<FormInstance> |
表单实例引用 |
TableRef |
Ref<ElTable> |
表格实例引用 |
| 插槽名 | 作用域参数 | 说明 |
|---|---|---|
| 默认插槽 | - | 放 el-table-column |
filter |
{ filter, add } |
自定义查询区与新增按钮 |
toolbar |
- | 表格上方工具栏 |
action |
- | 整体替换操作列 |
actionMore |
{ row, edit, delete } |
默认编辑/删除按钮前插入内容 |
actionMoreAfter |
{ row, edit, delete } |
默认编辑/删除按钮后插入内容 |
form |
{ setFormRef, form, action, errors, loading, close, submit } |
自定义新增/编辑表单 |
<template>
<ETable
ref="tableRef"
list-url="/api/user/list"
add-url="/api/user/add"
submit-url="/api/user/edit"
delete-url="/api/user/delete"
pk="id"
notice-filed="name"
:query="{ status: 1 }"
:request-method="{ addUrl: 'POST', submitUrl: 'PUT', deleteUrl: 'DELETE' }"
@before-submit="handleBeforeSubmit"
>
<template #filter="{ filter, add }">
<el-form-item label="姓名">
<el-input v-model="filter.name" placeholder="请输入姓名" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="add">新增</el-button>
</el-form-item>
</template>
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="name" label="姓名" />
<el-table-column prop="email" label="邮箱" />
<template #form="{ setFormRef, form, action, submit, close }">
<el-form :model="form" :ref="setFormRef">
<el-form-item label="姓名" prop="name" required>
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="邮箱" prop="email" required>
<el-input v-model="form.email" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submit">
{{ action === 'add' ? '创建' : '保存' }}
</el-button>
<el-button @click="close">取消</el-button>
</el-form-item>
</el-form>
</template>
</ETable>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const tableRef = ref()
const handleBeforeSubmit = (form: Record<string, unknown>, next: (arg: unknown) => void) => {
const payload = { ...form, updatedAt: Date.now() }
next(payload)
}
</script><template>
<div>
<el-button @click="refresh">手动刷新</el-button>
<el-button @click="resetTable">清空筛选</el-button>
<ETable ref="tableRef" list-url="/api/order/list" />
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const tableRef = ref<{
fetchList: () => void
clear: () => void
}>()
const refresh = () => tableRef.value?.fetchList()
const resetTable = () => tableRef.value?.clear()
</script>- 当前源码字段名为
defualtFilter、noticeFiled,使用时请按该拼写传参。 - 组件会把未声明的属性通过
$attrs透传到el-table,可直接使用 Element Plus 的表格属性和事件。