Skip to content

表单解析器

1. 介绍

表单解析器是一个可以将json格式解析渲染为表单的组件,支持自定义渲染器,注册组件,自定义组件hook,属性注入等。

2. 安装

shell
npm install @xfc/vue3-form-render

3. 注册组件

通过 addComponent 方法注册组件,组件注册后可以在json中通过 name 属性引用。

typescript
import { useSelect } from './hooks/useSelect'
import { useFormRender } from '@xfc/vue3-form-render'
import http from '@/axios'

const { Render, FormRender, addComponent, removeComponent, components, hooks } = useFormRender({
  injects: {
    http: http
  }
})
export { Render, FormRender, addComponent, removeComponent, components, hooks }
addComponent('Form', ElForm)
addComponent('Input', ElInput)
addComponent('Textarea', ElInput)
addComponent('Number', ElInputNumber)
addComponent('Select', ElSelect, useSelect)
...

4. 注册Hook

通过 addComponent 添加组件时附带添加上该组件的Hook,Hook可以在组件渲染器修改组件属性,事件等。

tsx
import type { FormField } from '@xfc/vue3-form-render'

export const useSelect = function (field: FormField) {
    const slots = {
        default: () => {
            return field.props.options?.map((item: Recordable) => {
                return <el-option label={item.label} value={item.value} disabled={item.disabled} />
            })
        }
    }
    if (!field.slots) {
        field.slots = {}
    }
    Object.assign(field.slots, slots)
}
addComponent('Select', ElSelect, useSelect)

5. 渲染器

默认渲染器分为2种分别为:

  • formItem: 表单项渲染器
  • container: 容器渲染器

自定义渲染器:

渲染器命名优先级:id > name > type,比如如果存在id为 custom 的FormField对象,则会优先使用custom渲染器。

typescript
const { Render, FormRender, addComponent, removeComponent, components, hooks } = useFormRender({
  injects: {
    http: http
  },
  renders:{
    custom: field => {
      return h(Render, {field})
    }
  }
})

6. 注入方法/属性

注入后的方法属性可以的组件事件中调用,比 customFun 为例。

typescript
const { Render, FormRender, addComponent, removeComponent, components, hooks } = useFormRender({
    injects: {
        http: http,
        customFun: ()=>{console.log('测试')}
    }
})

FormField 对象的on事件中调用通过 $inject 调用注入的方法。

typescript
const formConf = ref<FormField>({
    id: 'formConf',
    name: 'Form',
    icon: 'ep:document',
    type: 'container',
    label: '表单',
    value: undefined,
    readonly: false,
    required: undefined,
    hidden: false,
    props: {...},
    on: {
        onMounted: '$inject.customFun()',
        onUnmounted: '',
        onValidate: ''
    },
    children: []
})

7. 插槽扩展

插槽分为3类分别为:

  • 父容器插槽:

    插槽名参数说明
    prependfield顶部追加渲染组件
    defaultchild、field默认插槽,覆盖默认的子项
    appendfield底部追加渲染组件
  • 组件插槽:

组件插槽分为3类优先级分别为:id > name > type

插槽名参数说明
FormField 内(id、name、type)值node、field覆盖渲染组件
  • 只读插槽:

如果对默认只读显示或某些组件的只读显示不满意可以使用该插槽替换默认的只读显示。

插槽名参数说明
readonlyvalue、field覆盖所有只读显示
readonly-${field.name}value、field覆盖指定组件的只读显示