# API

# Form-Item

Form-Item 基于 Element 的 el-form-item 进行扩展,支持配置 Form-Item 头尾。

# Form-Item Attributes

参数 说明 类型 可选值 是否必传 默认值
title/label 标题,对应 el-form-item 的 label string/动态组件 - -
visible 是否展示该控件组 boolean true/false true
head Form-Item 头部 string/动态组件 - -
tail Form-Item 尾部 string/动态组件 - -
component 组件类型 string/动态组件 input/input-number/autocomplete/checkbox/switch/rate/color-picker/slider/cascader/time-picker/time-select/date-picker/plain-text/link/upload/radio-group/checkbox-group/select -
component 组件类型 动态组件 Vue 组件对象 -
field element 控件配置,不同的控件值不一样 Object - -
field.scrub label增加滑动改变数值功能, input-number组件才有效 boolean true/false false
rules 对应 el-form-form 的 rules Object - -
... 其他 el-form-item 的参数

除 title 外,其他属性都是扩展的 JSON Schema 属性。

# component 动态组件示例

动态组件使用示例

<template>
  <el-select
    v-bind="config.field"
    v-on="$listeners"
    v-model="model[config.prop]"
    @change="handleChange"
  >
    <el-option
      v-for="opt in config.field.options"
      :key="opt.value"
      v-bind="opt"
    ></el-option>
  </el-select>
</template>

<script>
export default {
  props: {
    config: {
      type: Object,
      required: true
    },
    model: {
      type: Object,
      required: true
    }
  },

  mounted () {
    console.log(this.config)
    console.log(this.model)
    console.log(this.$listeners)
  },

  methods: {
    handleChange (val) {
      // 动态组件数据变更后要更新
      this.$emit('update-field', { prop: this.config.prop, value: val })
    }
  }
}
</script>
{
  label: '动态表单控件示例',
  component: DynamicFormItemField,
  rules: [{ required: true, message: '请选择动态组件' }],
  field: {
    options: [
      {
        value: 1,
        label: '选项一'
      },
      {
        value: 2,
        label: '选项二'
      }
    ]
  }
}

数据变更时,需要向上派发一个 update-field 事件,以此来触发 el-schema-form 事件的 change 事件。格式如下:

this.$emit('update-field', { prop: this.config.prop, value: val })

prop 是当前控件对应的 key 值,value 要更新的值。

# formItemComponent 示例

<template>
  <el-form-item prop="dynamic_component2" label="动态 form item">
    <el-button @click="handleClick">哈哈哈</el-button>
  </el-form-item>
</template>

<script>
export default {
  props: {
    config: {
      type: Object,
      required: true
    },
    model: {
      type: Object,
      required: true
    }
  },

  mounted () {
    console.log(this.config)
    console.log(this.model)
    console.log(this.$listeners)
  },

  methods: {
    handleClick () {
      this.$emit('click', 'dynamic_component2 组件点击')
    }
  }
}
</script>

在 schema 中的配置示例

{
  label: '动态表单控件示例',
  rules: [{ required: true, message: '请选择动态组件' }],
  formItemComponent: DynamicFormItem,
  listeners: {
    click: (val) => {
      console.log(val)
    }
  }
}

formItemComponent 动态组件派发的事件交由 listeners 捕获,如以上代码示例。

数据变更时,需要向上派发一个 update-field 事件,以此来触发 el-schema-form 事件的 change 事件。格式如下:

this.$emit('update-field', { prop: this.config.prop, value: val })

prop 是当前控件对应的 key 值,value 要更新的值。

# Field

表单控件,如 input、color-picker、upload 等等。每个控件都有对应的 Form-Item,不同类型的控件有其独有的配置,配置兼容 Element 对应的组件。

# FieldSet

FieldSet 是什么?

控件组,用来对表单中的控制元素进行分组。对表单做结构上的优化,减少信息噪音。

# Form Schema 是如何定义 Fieldset 的?

Schema 的 type 是 object 或 array,El Schema Form 将其渲染为一个 fieldset,fieldset 可以嵌套 fieldset。控件组可以统一处理某逻辑,如禁用控件组内的 Form Item。

# Array Fieldset

类型为 array 的 Schema,通过 items 属性定义列表内 Form Item。

{
  type: 'array',
  title: '用户',
  minItems: 3,
  maxItems: 6,
  items: {
    type: 'object',
    title: '定制标题',
    default: {
      name: '',
      age: '',
      gender: ''
    },
    properties: {
      age: {
        title: '年龄',
        type: 'number',

        component: 'input',
        rules: [
          {
            required: true,
            message: '请输入年龄'
          }
        ],
        field: {
          placeholder: '年龄不能为空',
          type: 'number'
        }
      },
      gender: {
        title: '性别',
        type: 'string',

        component: 'select',
        rules: [
          {
            required: true,
            message: '请选择性别',
            trigger: 'change'
          }
        ],
        field: {
          clearable: true,
          options: [
            {
              value: 'male',
              label: '男'
            },
            {
              value: 'female',
              label: '女'
            },
            {
              value: 'others',
              label: '其它'
            }
          ]
        }
      }
    },

    border: false
  },

  addable: true,
  orderable: true,
  removable: true
}

# Array Fieldset Attributes

参数 说明 类型 可选值 是否必传 默认值
type 类型 String array array
title 控件组标题 String/动态组件 - -
visible 是否展示该控件组 boolean true/false true
description 控件组描述 String/动态组件 - -
addable 控件组是否可新增子项 Boolean/Object/Function - false
removable 控件组子项是否可删除 Boolean/Object/Function - false
orderable 控件组是否可排序 Boolean/Object - false
minItems 控件组最小个数 Number - -
maxItems 控件组最大个数 Number - -
errors 自定义错误 {message: ''}[] - -
items 控件组子项配置 Object/Array - -
additionalItems 控件组额外项配置 Object - -
disabled 是否禁用控件组,会继承父控件组的值 Boolean true/false false

# addable

添加按钮默认使用 el-button,根据自己的需要选择合适的配置。

  • Boolean:可选值 true/false,当不需要自定义 UI 时,使用 Boolean 值即可
  • Object:el-button 属性,当需要自定义 UI 时使用
  • Function:返回 Boolean 或 Object,返回 Object 将传递给 el-button,当需要根据某些其它状态判定是否可新增时使用

# removable

删除按钮默认使用 el-button,根据自己的需要选择合适的配置。

  • Boolean:可选值 true/false,当不需要自定义 UI 时,使用 Boolean 值即可
  • Object:el-button 属性,当需要自定义 UI 时使用
  • Function:返回 Boolean 或 Object,返回 Object 将传递给 el-button,当需要根据某些其它状态判定是否可删除时使用

# orderable

排序默认使用 el-button,根据自己的需要选择合适的配置。

  • Boolean:可选值 true/false,当不需要自定义 UI 时,使用 Boolean 值即可
  • Object:el-button 属性,当需要自定义 UI 时使用

orderable 为 Object 的配置说明:

参数 说明 类型 可选值 是否必传 默认值
moveUp 往下按钮属性 Object - -
moveDown 往上按钮属性 Object - -

# Object Fieldset

类型为 object 的 Schema,通过 properties 属性定义列表内 Form Item。

{
  title: '个人信息',
  description: '请详细填写个人信息',
  type: 'object',
  order: ['age', 'name'],
  disabled: true,
  properties: {
    name: {
      component: 'input',
      label: '用户名',
      rules: [{ required: true }],
      field: {
        placeholder: '请输入用户名'
      }
    },
    age: {
      component: 'input',
      label: '年龄',
      rules: [{ type: 'number', required: true }],
      field: {
        type: 'number',
        placeholder: '请输入年龄'
      }
    }
  }
}

# Object Fieldset Attributes

参数 说明 类型 可选值 是否必传 默认值
type 类型 String object object
title 控件组标题 String/动态组件 - -
description 控件组描述 String/动态组件 - -
order 为对象排序,碰到调整顺序的需求时,无需移动子项的代码,只需要使用 order 去调整即可 String[] - -
properties 控件组子项配置 Object - -
disabled 是否禁用控件组,会继承父控件组的值 Boolean true/false false

# 更多