Skip to content

绑定组件

vue-dynamic-form 不带复杂的表单组件,不与任何UI库耦合。因此您可以选择安装自己喜欢的UI框架或其他库, 使用UI库的表单组件,需要将其绑定后即可在动态表单中使用。

推荐:

步骤

这里以 arco.design Vue 为例,展示如何绑定组件。

首先参考 arco.design Vue 文档将其安装。

然后在 main.js 中注册你需要的组件:

js
import { markRaw } from "vue";
import { Alert, Checkbox, DatePicker, Form, FormItem, Image, Input, InputNumber, Rate, Switch, Textarea, TimePicker } from "@arco-design/web-vue";
import { DynamicFormItemRegistry, type IDynamicFormOptions, configDefaultDynamicFormOptions } from "@imengyu/vue-dynamic-form";

createApp(App)
  .mount('#app')
  .$nextTick(() => {
    registerAllFormComponents();
  });

//这个函数请保证全局只注册一次
function registerAllFormComponents() {
  //1. 配置 Form 与 FormItem
  //
  //当你使用了自定义UI框架,别忘记替换默认的 Form 和 FormItem 为UI框架中的 Form 和 FormItem,
  //这样才能让表单工作正常(因为表单渲染、数据校验等等功能,这部分功能由UI框架提供)。
  configDefaultDynamicFormOptions({
    internalWidgets: {
      Form: {
        component: markRaw(Form),
        propsMap: {
          //每个UI框架的属性名称有点不一样,你需要根据对应的文档重新映射对应的属性名称
          //右边是组件对应的属性名称
          rules: 'rules',
          wrapperCol: 'wrapper-col-props',
          labelCol: 'label-col-props',
        },
      },
      FormItem: {
        component: markRaw(FormItem),
        propsMap: {
          name: 'field',
        },
      },
    },
  });

  //2. 注册你需要使用的库组件。当然,这里也可以注册自己自定义的组件
  //第1个参数是:在表单定义中使用时的名称,请保证不重复。
  //第2个参数是:组件的类实例。
  //第3个参数是:组件的默认参数, 每一个组件创建时都会继承此默认参数。在表单定义中传入的 additionalProps 优先级比此高,会覆盖默认参数。
  //第4个参数是:组件的双向绑定 modelValue 字段名称,这个value用于双向绑定表单的值,当你的组件主 modelValue 名称不一致时,
  //            例如有些复选框双向绑定字段名称是checked,可以重新指定。
  //
  //注册自定义组件请参考下方章节
  DynamicFormItemRegistry
    .register('text', markRaw(Input), {}, 'modelValue')
    .register('password', markRaw(Inpu.tPassword), {}, {}, 'modelValue')
    .register('number', markRaw(InputNumber), {}, 'modelValue')
    .register('text-area', markRaw(Textarea), {}, 'modelValue')
    .register('switch', markRaw(Switch), {}, 'modelValue')
    .register('check-box', markRaw(Checkbox), {}, 'modelValue')
    .register('date', markRaw(DatePicker), {}, 'pickerValue')
    .register('time', markRaw(TimePicker), {}, 'modelValue')
    .register('date-time', markRaw(DatePicker), { showTime: true }, 'pickerValue');
}

然后你就可以在表单中使用刚刚注册的组件了,

警告:未找到表单组件实例 text
警告:未找到表单组件实例 text
警告:未找到表单组件实例 static-image
警告:未找到表单组件实例 password
警告:未找到表单组件实例 password
警告:未找到表单组件实例 text

案例

作者为你写了下面几个热门库的案例,你也可以复制到你自己的项目中使用, 对于其他组件库,如果有对应的表单组件,也可以按上方步骤自己注册使用。

WARNING

有些库可能不支持某些字段,例如Element plus不支持表单的内容宽度占比调整。

注册自定义组件

注册自定义组件与注册UI库的组件一致,你只需使用 DynamicFormItemRegistry 注册即可使用:

js
import MyFormComponent from './MyFormComponent.vue';

DynamicFormItemRegistry.register('my-cmponent-name', markRaw(MyFormComponent), {}, 'modelValue');

注意,在写自定义组件时请处理与表单/动态表单的数据关系。具体请参考 自定义组件

Released under the MIT License.