很多人搜索 Element Plus,第一层需求是找组件用法,第二层需求才是真正困难的:一个后台页面写到后面,表格、搜索表单、新增弹窗、编辑弹窗、删除确认、分页、接口状态全混在一起。
Element Plus 本身解决的是“组件可用”,不是“业务页面可维护”。所以这篇文章重点讲:在 Vue 3 项目里,如何用 Element Plus 组织一个真实后台页面。
如果你还在做组件库选型,可以先看 Vue 组件库怎么选 和 Vue 表单最佳实践。
先给结论:后台页面要按状态分层,而不是按组件堆叠
一个典型后台页面至少有 5 类状态:
| 状态 | 示例 | 最容易乱在哪里 |
|---|---|---|
| 查询状态 | keyword、status、dateRange | 和分页互相覆盖 |
| 列表状态 | rows、loading、total | 刷新时机不清楚 |
| 表单状态 | model、rules、errors | 新增和编辑共用混乱 |
| 弹窗状态 | visible、mode、currentId | 打开关闭后残留数据 |
| 提交状态 | saving、deleting | 重复提交和按钮状态 |
可维护的页面不是组件少,而是这些状态有清楚边界。
一、推荐目录与文件组织
中小后台页面可以先保持单文件,但一旦出现新增/编辑弹窗、复杂筛选和批量操作,就建议拆分:
UserListPage.vue
components/
UserSearchForm.vue
UserTable.vue
UserEditDialog.vue
composables/
useUserList.ts
useUserForm.ts
拆分的标准不是“代码超过多少行”,而是职责是否不同:搜索、表格、编辑、接口状态应该各自清楚。
二、搜索表单和分页必须绑定成一个查询模型
后台列表最常见的 bug 是:改了筛选条件,但分页没有回到第一页;或者刷新列表时 query 和 URL 不一致。
推荐把查询条件收敛为一个模型:
interface UserQuery {
keyword: string
status: 'all' | 'enabled' | 'disabled'
page: number
pageSize: number
}
const query = reactive<UserQuery>({
keyword: '',
status: 'all',
page: 1,
pageSize: 20
})
const search = async () => {
query.page = 1
await fetchUsers()
}
const changePage = async (page: number) => {
query.page = page
await fetchUsers()
}
这样搜索和分页不会各自维护一套状态。
三、表格列不要只写展示,还要写空态、权限和操作边界
Element Plus 的 el-table 很容易写成“数据字段展示器”,但真实项目更需要处理:
- 字段为空时显示什么
- 操作按钮是否受权限控制
- 长文本是否需要 tooltip
- 状态字段是否需要视觉区分
- 批量选择是否与分页联动
一个可维护表格应该先定义列意图:
| 列类型 | 关注点 |
|---|---|
| 文本列 | 空值、截断、复制 |
| 状态列 | 文案、颜色、枚举一致性 |
| 时间列 | 时区、格式、排序 |
| 操作列 | 权限、确认、loading |
不要把所有判断都塞进模板里。枚举映射、格式化函数和权限判断应该集中管理。
四、新增和编辑弹窗可以共用,但模式必须显式
很多页面会共用一个弹窗做新增和编辑,这没问题,但必须把模式写清楚:
type DialogMode = 'create' | 'edit'
const dialogVisible = ref(false)
const dialogMode = ref<DialogMode>('create')
const editingId = ref<string | null>(null)
const openCreate = () => {
dialogMode.value = 'create'
editingId.value = null
resetForm()
dialogVisible.value = true
}
const openEdit = async (id: string) => {
dialogMode.value = 'edit'
editingId.value = id
await loadDetail(id)
dialogVisible.value = true
}
如果只靠“有没有 id”判断模式,后面很容易在复制、草稿、详情回填时出错。
五、表单校验不要只依赖 UI 组件
Element Plus 的校验能力足够覆盖大部分页面,但业务规则仍然要有自己的边界。例如:
- 前端校验负责即时反馈
- 后端校验负责最终一致性
- 接口错误要映射到字段或全局提示
- 保存中要禁用重复提交
提交流程建议固定为:
本地校验 -> 组装 payload -> 调接口 -> 错误映射 -> 成功后关闭弹窗并刷新列表
这条链路一旦稳定,后续页面可以复用同一套心智模型。
六、失败案例:弹窗关闭后残留上一次编辑数据
这是 Element Plus 后台页面里非常常见的问题。表现是:编辑 A 用户后关闭弹窗,再新增用户,表单里还残留 A 的信息。
常见根因:
- 关闭时没有重置表单模型
- 表单模型直接引用了列表行对象
resetFields调用时机早于表单挂载- 新增和编辑没有显式模式
修复重点是两条:
- 表单模型必须是独立副本,不要直接改 table row
- 打开弹窗时按模式初始化,关闭时清理状态
七、上线前 Checklist
- 搜索条件变化时分页回到第一页
- loading、empty、error 状态都有表现
- 新增和编辑模式显式区分
- 表单关闭后不会残留旧数据
- 删除、批量操作有确认和防重复提交
- 权限控制不只隐藏按钮,也要处理接口失败
- 表格长文本、空值、枚举都有统一规则
结语
Element Plus 能让后台页面起步很快,但页面能不能长期维护,取决于你如何组织状态、模式和验证流程。把查询、表格、弹窗、表单和提交拆清楚,比记住更多组件属性更重要。
延伸阅读:


