Skip to content

ElCruPage CRU 编辑页面

<el-cru-page /> 组件是一个超级组件,它聚合了 <el-simple-page-header /><el-form-builder /> 两个组件,并提供了一些便捷的配置和功能。它主要用于常见的 CRU 编辑页面。

一般与业务侧的列表页 / 查询页配合:由路由或按钮进入本编辑页。仓库内 el-cru-index 尚在计划中,可直接自建列表 + <el-cru-page /> 路由。

页头常见为【返回】+ 标题 选项卡(无 title 时默认 申请信息 / 流程图)。【保存】【提交】(及可选【重置】)ElFormBuilderactionsportal-vue 落到页头右侧 ${uid}-actions,与 el-form-query 命名一致;并非插在头部组件内部写死的内容。若产品设计与此差异大,可改用 el-simple-page-header + el-form-builder 自行组合。

基础用法

只需要提供表单的 modelschemasubmitHandlersaveHandler 即可,其他配置项使用默认值即可。

选项卡模式

headerConfig 中不配置 title(且不使用 #title)时,页头为选项卡布局;默认仍为 申请信息value: '0')与 流程图value: '1'),可用 tabConfig / defaultTab 覆盖。

  • tab === defaultTab tab 为空(仅有标题、无选项卡状态)时:表单与 #form-prepend / #form-append 会包在同一 PortalTarget 内,名为 ${uid}-tab-${defaultTab}(与 headerConfig.defaultTab / 首项 tabConfig 解析一致)。
  • 切换到其它 tab 时:主体区域只挂载空的 ${uid}-tab-<当前 value> PortalTarget不含表单;该 tab 的内容须在默认插槽uid,使用 Portalto 指向上述名称注入(见 tabs 示例)。

默认插槽参数:{ uid }(与 props.uid 或内部生成的 id 一致)。

说明

选项卡的自定义配置可以参考 <el-simple-page-header /> 组件的配置。

下面我们通过自定义选项卡配置来实现一个更加复杂的页面。

表单配置

组件内部封装 <el-form-builder /> 组件,它提供了表单布局、分组与自定义字段的能力。

说明

表单的配置项与 <el-form-builder /> 组件的配置项一致。

如何添加自定义内容

默认插槽

根级默认插槽仅暴露作用域参数 { uid }(实现上等价于将 uid 传给子树),适用于:

  • 非默认 tab 下,向 ${uid}-tab-* 投递 Portal 内容;
  • 向页头 ${uid}-actions 扩展按钮(配合 order,见 ElSimplePageHeader / el-form-query 约定);
  • ElFormBuilder 已暴露的锚点命名(如 ${uid}-form-header${uid}-<分组 field>-group-extra 等)投递内容,详见 FormBuilder 与示例 content

如需 formRef / 表单 model 引用:请使用 v-model 绑定页面数据,或对 ElCruPage 使用 组件 ref,通过 defineExpose 访问(与下表 Expose 一致);默认插槽不会传入 formRef / model

页面状态

通过 formConfig.mode 传给 ElFormBuilderedit(默认)、disabledpreview。详见 ElFormRenderer

disabled 下若某字段 dependencies.disabled 对当前 model 求值为 false,该字段仍可编辑(只读页面临时放开个别项)。

loading

loadingtrue 时:根节点设置 data-ell-cru-page-loading="true",表单区域容器使用 Element Plus v-loading(可作为页面级加载占位;与 formConfig 内其它配置无关)。

API

Props

属性名描述类型
modelValue表单数据,请使用 v-modelRecord<string, unknown>
uid与页头、ElFormBuilder 共用的实例 id,便于 portal 命名;未传时每挂载一次生成新 id(ulid),文档/联调建议固定传入string
loadingtrue 时根节点 data-ell-cru-page-loading,表单区 v-loadingboolean
headerConfig透传 ElSimplePageHeader(内部的 uid 由本组件覆盖)EllSimplePageHeaderProps
formConfigElFormBuilder 配置,不含 modelValueuidactions 及三个 *Handler(由本组件注入)见类型 ElCruPageProps['formConfig']
toolbarActions要展示的默认按钮及顺序;默认 ['save','submit'](不含重置);重复项去重('reset' | 'save' | 'submit')[]
submitHandler提交:校验通过后调用(未传时 ElFormBuilderemit('submit')(model, formRef) => void | Promise<void>
saveHandler保存:不校验(未传时仍 emit('save')(model, formRef) => void | Promise<void>
resetHandler若传入则覆盖 重置 默认行为(详见 ElFormBuilder(model, formRef) => void

*Handler 的关系

  • toolbarActions 决定是否生成对应内置 actionPortal${uid}-actions)。
  • submit / save / reset 的点击逻辑仍由 submitHandler / saveHandler / resetHandler(及 ElFormBuilder 默认 reset)处理。

Events

事件名描述
update:modelValue表单数据变更
back页头返回
tabChange / tabChangeError选项卡切换(透传头部)
submit / save校验通过后的提交、保存(载荷为当前 model 对象,透传 ElFormBuilder
reset重置(透传 ElFormBuilder
validateFailed校验失败(透传 ElFormBuilder

Slots

插槽名描述
默认作用域 { uid };用于 tabPortal、页头 ${uid}-actionsElFormBuilder 各锚点等
back透传页头 #back
title透传页头 #title(使用后页头 #extraElCruPage 提供 header-extraPortalTarget ${uid}-actions
header-extra仅在 #title 模式下,插在 #extra 内、PortalTarget 之前
form-prepend / form-append包进默认 tab${uid}-tab-${defaultTab} 目标内,紧贴 ElFormBuilder 上 / 下

Expose

属性/方法说明
uid解析后的实例 id
activeHeaderTab当前页头选项卡 valueref
formRef / model / formItemRef转发 ElFormBuilder
getControlRef / getFormItemRef转发 ElFormBuilder

类型说明

显示类型声明
ts
/**
 * 下文与 `packages/components/cru-page/src/types.ts` 对齐。
 * `EllSimplePageHeaderProps`、`ElFormBuilderProps`、`FormInstance` 由依赖包提供。
 */

import type { ElFormBuilderProps } from '@element-plus-lab/components/form-builder'
import type { EllSimplePageHeaderProps } from '@element-plus-lab/components/simple-page-header'
import type { FormInstance } from 'element-plus'

/** 页头工具栏内置按钮项;与 ElFormQuery 相同,Portal 目标名为 `${uid}-actions`。 */
export type EllCruPageToolbarAction = 'reset' | 'save' | 'submit'

/**
 * el-cru-page 的 Props 形状(v-model / modelValue 由 SFC defineModel 声明,本接口不重复列出)。
 */
export interface ElCruPageProps {
  uid?: string
  loading?: boolean
  headerConfig: EllSimplePageHeaderProps
  formConfig: Omit<
    ElFormBuilderProps,
    | 'modelValue'
    | 'uid'
    | 'actions'
    | 'submitHandler'
    | 'saveHandler'
    | 'resetHandler'
  >
  toolbarActions?: EllCruPageToolbarAction[]
  submitHandler?: (model: Record<string, unknown>, formRef: FormInstance | undefined) => void | Promise<void>
  saveHandler?: (model: Record<string, unknown>, formRef: FormInstance | undefined) => void | Promise<void>
  resetHandler?: (model: Record<string, unknown>, formRef: FormInstance | undefined) => void
}

贡献者

页面历史

Released under the Apache License 2.0.