# 快速开始

# 安装

由于 FormBuilder 通过 Vue Use 提供的 useForm Composition API 来管理表单状态,同时依赖 vee-validate 来进行表单校验,因此需要一起进行安装:

npm i @fext/vue-form-builder @fext/vue-use vee-validate

# 核心类库依赖

# 默认组件

若需要进行动态配置的表单组件已经全局注册,则可以直接使用内置的 FormBuilder 组件。

# 引入方式

直接引入 FormBuilder 组件:

import { FormBuilder } from '@fext/vue-form-builder';

此外,你也可以通过插件将 FormBuilder 注册为全局组件:

import FormBuilderPlugin from '@fext/vue-form-builder';

Vue.use(FormBuilderPlugin);

# 使用方式

在父级组件中,需要先通过 useForm 创建表单的 Composition API,并提供表单的 JSON 配置:

import { useForm } from '@fext/vue-use';
import { FormBuilder } from '@fext/vue-form-builder';

export default {
  name: 'awesome-form'

  components: {
    FormBuilder
  },

  setup() {
    // Form Composition API
    const form = useForm();
    const { formValues, updateFormValues } = form;

    return {
      form

      /* 表单数据模型 */
      formValues,

      /* 手动更新表单数据模型 */
      updateFormValues
    };
  },

  data() {
    return {
      formConfig: [/* JSON Schema */]
    }
  }
}

模板结构:

<div>
  <form-builder :form="form" :config="formConfig"></form-builder>
</div>

# 工厂函数

很多情况下,我们并不希望将所有的表单组件都注册到全局。此时我们可以使用工厂函数 createFormBuilder 构建一个定制化的 FormBuilder

import { useForm } from '@fext/vue-use';
import { createFormBuilder } from '@fext/vue-form-builder';
import ExampleFormComponents from 'path/to/components';

export default {
  name: 'awesome-form'

  components: {
    FormBuilder: createFormBuilder({
      components: {
        ...ExampleFormComponents
      }
    })
  }

  /* ... */
}

# 框架适配器

在一些流行的 UI 框架中,已经实现了很多表单基础组件,为了让你能够快速使用这些组件,我们提供了几种适配器。

实际开发过程中,你也可以根据需要封装自己的适配器。

# Element UI

组件 ElFormAdaptor 引入方式:

import ElFormAdaptor from '@fext/vue-form-builder/lib/adaptor/element';

或全局注册:

import ElFormAdaptorPlugin from '@fext/vue-form-builder/lib/adaptor/element';

Vue.use(ElFormAdaptorPlugin);

# View UI

组件 ViewFormAdaptor 引入方式:

import ViewFormAdaptor from '@fext/vue-form-builder/lib/adaptor/view';

或全局注册:

import ViewFormAdaptorPlugin from '@fext/vue-form-builder/lib/adaptor/view';

Vue.use(ViewFormAdaptorPlugin);

# Ant Design Vue

import AntFormAdaptor from '@fext/vue-form-builder/lib/adaptor/antd';

或全局注册:

组件 AntFormAdaptor 引入方式:

import AntFormAdaptorPlugin from '@fext/vue-form-builder/lib/adaptor/antd';

Vue.use(AntFormAdaptorPlugin);

# 完整示例

下面我们通过工厂函数和 Element UI 适配器演示一下实际用法:

<el-form>
  <form-builder :form="form" :config="formConfig"></form-builder>
</el-form>
import { useForm } from '@fext/vue-use';
import { createFormBuilder } from '@fext/vue-form-builder';
import ElFormAdaptor from '@fext/vue-form-builder/lib/adaptor/element';

export default {
  components: {
    FormBuilder: createFormBuilder({
      components: {
        ElFormAdaptor
      }
    })
  },

  setup() {
    const form = useForm();
    const { formValues, updateFormValues } = form;

    return {
      form,

      /* 表单数据模型 */
      formValues,

      /* 手动更新表单数据模型 */
      updateFormValues
    };
  },

  data() {
    return {
      formConfig: [
        {
          component: 'el-card',
          props: {
            header: 'Basic Group'
          },
          fields: [
            {
              name: 'comment',
              component: 'ElFormAdaptor',
              label: 'Description',
              rules: {
                required: true
              },
              props: {
                type: 'textarea',
                rows: 5,
                placeholder: 'Use adaptor and render with default(el-input) component'
              }
            }
          ]
        }
      ]
    };
  }
};