Skip to content

PowerfulForm

文档中大写开头的表示类型 例如:PowerfulTableHeaderProps.type 表示 PowerfulTableHeaderProps 类型下的 type 属性 DEMO

标签
表示功能废弃
表示功能新增
语言

对于语言方面组件是默认使用 英语 因为 element-plus 默认是使用英语,不引用中文包的主要原因是避免增大体积。 组件内部语言跟随 element-plus。 部分 提示文字 语言,组件内部也支持 中、英 文,如果你需要支持更多语言或者更改组件内部 的语言,可以在 use(PowerfulForm, { local: 您的语言变量 }) 替换。也可以参考我们提供的 demo 实现。

继承关系

表单配置可以和表格配置重合,可以说配置一个表格的 headers 再加上一两行数据即可配置一个表单

TIP

下面 index.vue 中演示了基础的继承关系, extend-table 传递 true 时,form-view 组件内部自动回去 powerful-table 获取 header 配置(请保证 powerful-table refPTable 。当然如果你 powerful-table ref 为其他值时,请保证 extend-tablepowerful-table ref 一致)

Details
ts
// powerful-table(表格) props
export const columns: PowerfulTableHeader<Lists>[] = [
  {
    label: '制造商',
    width: 200,
    overflowTooltip: true,
    isShowOrFilterColumn: 'filter',
    defaultFilter: true,
    headerAlign: 'left',
    props: [
      {
        type: 'href',
        prop: 'manufacturerHref',
        text: '厂商:',
        data: setData<'href', Lists>({
          text: (row: any) => row.manufacturer,
          property: {
            underline: true,
          },
        }),
      },
      {
        prop: 'icon',
        type: 'iconfont',
        text: '车标:',
        data: setData<'iconfont', Lists>({
          class: 'viteIcon',
          style: {
            height: '40px',
            lineHeight: '40px',
            fontSize: '40px',
          },
        }),
      },
    ],
  }
]
tsx
// powerful-form(表单) props formItems
export const formItems: FormItem[] = [
  {
    text: '制造商:',
    prop: 'manufacturer',
    type: FormTypeEnum.Input,
  },
  {
    type: FormTypeEnum.Select,
    prop: 'brand',
    text: '品牌:',
    data: {
      options: [
        { label: 'Audi', value: '奥迪' },
        { label: 'BMW', value: '宝马' },
      ],
    },
  },
  {
    text: '收藏:',
    prop: 'switchVal',
    basis: '45%',
    type: FormTypeEnum.Switch,
  },
  {
    prop: 'price',
    text: '售价:',
    type: FormTypeEnum.Input,
  },
  {
    type: FormTypeEnum.DatePicker,
    text: '发售日期:',
    prop: 'data',
  },
  {
    type: FormTypeEnum.DatePicker,
    text: '日期区间:',
    prop: 'dateRange',
  },
  {
    text: '简介',
    prop: 'content',
  },
]
tsx
// 表格结合表单
export const columns: PowerfulFormPTHeaders[] = [
  {
    label: '制作厂', //显示的名称
    headerAlign: 'left',
    props: [
      {
        type: 'href',
        prop: 'manufacturerHref',
        text: '厂商:',
        data: {
          text: (row: any) => row.manufacturer,
          property: {
            underline: true,
          },
        },
        formItem: {
          type: FormTypeEnum.Select,
          data: {
            options: [
              {
                label: 'a1',
                value: '1',
                options: [
                  {
                    label: 'a3',
                    value: '3',
                  },
                  {
                    label: 'a3',
                    value: '3',
                  },
                ],
              },
              {
                label: 'a2',
                value: '2',
                options: [
                  {
                    label: 'a3',
                    value: '3',
                  },
                  {
                    label: 'a3',
                    value: '3',
                  },
                ],
              },
            ],
            slots: {
              // 自定义插槽
              default: (h) => <div>自定义插槽</div>,
            },
          },
        },
      },
      {
        prop: 'icon',
        type: 'iconfont',
        text: '车标:',
        data: {
          class: 'viteIcon',
          style: {
            height: '40px',
            lineHeight: '40px',
            fontSize: '40px',
          },
        },
        formItem: {},
      },
    ],
  }
]
html
<template>
  <PowerfulTable
    ref="PTable"
    :list-request="{
      listApi,
    }"
    :header="header"
  />

  <PowerfulForm ref="FView" :extend-table="true"/>
<template>

<script>
  // ...
</script>

使用方法

sh
npm i el-plus-powerful-form
sh
yarn add el-plus-powerful-form
sh
pnpm add el-plus-powerful-form
ts
import PowerfulForm from "el-plus-powerful-form";
import { LangKey } from "el-plus-powerful-form";

const app = createApp(App);
app.use(PowerfulForm, {
  // 更改组件默认语言
  locale: {
    en: {
    [LangKey.VerifyPhone]: '手机号验证失败',
    [LangKey.VerifyEmail]: '邮箱地址验证失败',
    [LangKey.VerifyEmpty]: `数据不能为空`,
      // ...
    },
    'zh-cn': {
    [LangKey.VerifyPhone]: '手机号验证失败',
    [LangKey.VerifyEmail]: '邮箱地址验证失败',
    [LangKey.VerifyEmpty]: `数据不能为空`,
      // ...
    },
  },
});
app.mount("#app");
vue
<PowerfulForm :list="list" :header="header" />

Config Attributes

通过 app.use 注入

属性名说明TS类型默认值
locale内部部分文字语言 查看可选值LangPackages-

Attributes

属性名说明TS类型默认值
showType显示类型,当为 query 时不会向 el-form 传递 rulestring-
extendTable是否继承表格。如果是 true 的话自动查找 table 组件 ref 名称为 PTable 的,也可以传递 tableRef 名称boolean | stringfalse
formItems表单配置array-
formDataDefault表单默认值object-
disabled表单是否禁用boolean-
propertyel-form 组件 propsobject-
apisapis 接口合集function | object-

Apis

TIP

支持对象格式,也支持函数形式。
PowerfulForm 暴露了 submitForm 函数。调用 submitForm 函数时在校验通过后会自动调用 apisapis 时函数时直接触发,当 apis 时对象的时候会调用 apis 属性为 showType 的值。也就是 apis[showType] )。submitForm 函数返回一个 promise

html
<PowerfulForm ... :apis="() => Promise.resolve({ data: [] })" />
<PowerfulForm ... showType="update" :apis="{
 'added': () => Promise.resolve({ data: [] })
 'update': () => Promise.resolve({ data: [] })
}" />

<!-- 请保证您的 apis 中的函数有一个形参,这样的话,组件内部会将 formData 数据传递进去 -->
<PowerfulForm ... :apis="requestAdd" />

<script setup>
const requestAdd = (params) => {
  console.log(params) // 这里的 params 为 formData
  return Promise.resolve({ data: [] })
}
// ...
</script>

FormItems

属性名说明TS类型默认值
prop el-form-item prop 属性。
配合表格组件时,默认读取 PowerfulTableHeaderProps.prop
string-
textel-form-item label 属性。
配合表格组件时,默认读取 PowerfulTableHeader.label
string
slotName插槽名称。
配合表格组件时,默认读取 PowerfulTableHeaderProps.slotName
string
render渲染函数. 传递 render 时,不在根据 type 渲染function-
basisCSSflex-basis 属性,其元素宽度占比,当两个相邻的对象 basis48% 时,则这个两个元素在一行string'100%'
type默认 input 类型enum
dataPowerfulTableHeaderProps.type === FormItem.type 则继承 PowerfulTableHeaderProps.data。不同的 type data 值不一样FormType['xxx']
showType显示类型,部分数据只在新增表单显示,部分只在修改表单显示。默认全部显示。如果传递此值将和表单组件 props 中的属性showType 进行比较,相等则显示string | string[]-
defaultData表单数据数据默认值,默认寻找 表单组件 props 中的属性formDataDefault 相应的 propany-
rule规则校验,可以传递完整的 rule 规则,也可以传递部分规则例如:rule = true 开启必填校验;rule = [1, 10] 开启长度校验;rule = 'phone' 开启手机号校验;string | boolean | array-
propertyformItem props 请参见 Element Plus 文档Partial<FormItemProps>-

Type is Input(default) or Textarea

属性名说明TS类型默认值
symbol插槽的内容string-
style样式object-
slot如果只需要一个插槽的话可以使用 slot 参数,配合 symbol 实现'prepend' | 'append' | 'prefix' | 'suffix'-
on事件对象,接收下面 Event 相应方法名称object-
slotsel-input 组件 插槽object-
property属性扩展字段 (支持 el-input 组件所有属性名)object | function-
Input slots 说明
插槽名类型
prefixSlotFun
suffixSlotFun
prependSlotFun
appendSlotFun
Input Event
方法名说明类型
blur失焦function
change数据更改function
input输入function
focus聚焦function
clear清除function
Input Interface
ts
type SlotFun = (
  h: typeof createElement,
  row: PowerfulFormData['formData'],
  index: number
) => string | number | VNode | JSX.Element

type InputEmit<T = {
    /**
     * 表单配置项数据
     */
    formItem: FormItem<FormTypeEnum.Input>
    /**
     * 索引
     */
    index: number
    /**
     * 表单数据
     */
    formData: PowerfulFormData['formData']
  }> = {
  blur?: (params: T, ...arg: any) => void
  change?: (params: T, ...arg: any) => void
  input?: (params: T, ...arg: any) => void
  focus?: (params: T, ...arg: any) => void
  clear?: (params: T, ...arg: any) => void
}

Type is Switch

属性名说明TS类型默认值
style样式object-
on事件对象,接收下面 Event 相应方法名称object-
property属性扩展字段 (支持 el-switch 组件所有属性名)object | function-
Switch Event
方法名说明类型
change数据更改function
Switch Interface
ts
type SwitchEmit<T = {
    /**
     * 表单配置项数据
     */
    formItem: FormItem<FormTypeEnum.Switch>
    /**
     * 索引
     */
    index: number
    /**
     * 表单数据
     */
    formData: PowerfulFormData['formData']
  }> = {
  change?: (params: T, ...arg: any) => void
}

Type is Select

属性名说明TS类型默认值
style样式object-
options选项的数据源 optionsarray-
on事件对象,接收下面 Event 相应方法名称object-
slotsel-selectV2 组件 插槽object-
property属性扩展字段 (支持 el-selectV2 组件所有属性名)object | function-
Select Event
方法名说明类型
change数据变化function
focus聚焦事件function
blur失焦事件function
clear清除事件function
remove-tag删除标签事件,多选情况下存在function
visible-change显示隐藏事件function
Select Interface
ts
type SwitchEmit<T = {
    /**
     * 表单配置项数据
     */
    formItem: FormItem<FormTypeEnum.Select>
    /**
     * 索引
     */
    index: number
    /**
     * 表单数据
     */
    formData: PowerfulFormData['formData']
  }> = {
  change?: (params: T, ...arg: any) => void
  focus?: (params: T, ...arg: any) => void
  blur?: (params: T, ...arg: any) => void
  clear?: (params: T, ...arg: any) => void
  'remove-tag'?: (params: T, ...arg: any) => void
  'visible-change'?: (params: T, ...arg: any) => void
}

Type is Rate

属性名说明TS类型默认值
style样式object-
on事件对象,接收下面 Event 相应方法名称object-
options单选按钮数据 参考 radio propsarray-
property属性扩展字段 (支持 el-radio-group 组件所有属性名)object | function-
Rate Event
方法名说明类型
change数据更改function
Rate Interface
ts
interface RadioOptions {
  /**
   * Radio 自定义内容,没有则显示 label
   */
  text?: string
  /**
   * Radio label
   */
  label: string
  /**
   * 是否禁用复选框形式的表单
   */
  disabled?: FunBol<FormTypeEnum.Checkbox>
  /**
   * 是否显示边框
   */
  border?: boolean
  /**
   * 表单的名称
   */
  name?: string
}

type RateEmit<T = {
    /**
     * 表单配置项数据
     */
    formItem: FormItem<FormTypeEnum.Rate>
    /**
     * 索引
     */
    index: number
    /**
     * 表单数据
     */
    formData: PowerfulFormData['formData']
  }> = {
  change?: (params: T, ...arg: any) => void
}

Type is Radio

属性名说明TS类型默认值
style样式object-
options单选按钮数据 参考 radio propsarray-
on事件对象,接收下面 Event 相应方法名称object-
property属性扩展字段 (支持 el-radio-group 组件所有属性名)object | function-
Radio Event
方法名说明类型
change数据变化function
RadioDataEmit Interface
ts
type RadioDataEmit<T> = {
  /**
   * change 事件
   */
  change?: ((parameter: T, ...arg: any) => void) | undefined
}

Type is Checkbox

属性名说明TS类型默认值
style样式object-
options单选按钮数据 参考 radio propsarray-
on事件对象,接收下面 Event 相应方法名称object-
property属性扩展字段 (支持 el-check-group 组件所有属性名)object | function-
Checkbox Event
方法名说明类型
change数据变化function
Checkbox Interface
ts
type CheckboxDataEmit = RadioDataEmit<{
  /**
   * 表单配置项数据
   */
  formItem: FormItem<FormTypeEnum.Checkbox>
  /**
   * 索引
   */
  index: number
  /**
   * 表单数据
   */
  formData: PowerfulFormData['formData']
}>

Type is DatePicker

属性名说明TS类型默认值
style样式object-
on事件对象,接收下面 Event 相应方法名称object-
slotsel-date-picker 组件 插槽object-
property属性扩展字段 (支持 el-date-picker 组件所有属性名)object | function-
DatePicker slots 说明
插槽名类型
defaultSlotFun
'range-separator'SlotFun
DatePicker Event
方法名说明类型
change用户确认选定的值时触发function
blur在组件 Input 失去焦点时触发function
focus在组件 Input 获得焦点时触发function
calendar-change在日历所选日期更改时触发function
panel-change当日期面板改变时触发。function
visible-change当 DatePicker 的下拉列表出现/消失时触发function
DatePicker Interface
ts
type DatePickerEmit<T = {
    /**
     * 表单配置项数据
     */
    formItem: FormItem<FormTypeEnum.DatePicker>
    /**
     * 索引
     */
    index: number
    /**
     * 表单数据
     */
    formData: PowerfulFormData['formData']
  }> = {
  change?: ((parameter: T, ...arg: any) => void) | undefined
  blur?: ((parameter: T, ...arg: any) => void) | undefined
  focus?: ((parameter: T, ...arg: any) => void) | undefined
  'calendar-change'?: ((parameter: T, ...arg: any) => void) | undefined
  'panel-change'?: (parameter: T, ...arg: any) => void
  'visible-change'?: (parameter: T, ...arg: any) => void
}

Type is Slot

属性名说明TS类型默认值
----

Slots

插槽名说明
[slotName]表单内自定义的插槽名称

Utils/Hooks

函数名说明TS类型
getType获取变量类型function
deepClone深度克隆function
isTypeProtect类型保护 搜索 "用户自定义的类型保护"function
useGetRefs同步向上获取 ref 实例function
useAsyncGetRefs异步向上获取 ref 实例function

Expose

属性名说明类型
$slots所传递的插槽名称object
$attrs所传递的属性并且非 props 定义的属性名. 文档object
$refs表单 Ref 实例object
props组件 propsobject
powerfulFormDataPowerfulForm 组件数据object
formItemsformItems 更具 props.showType 过滤后的数据array
submitForm提交校验函数function
visibleFormTrigger控制表单显隐function
refreshRender刷新从表格继承数据function

Released under the MIT License.