包括各种表单项,比如输入框、选择器、开关、单选框、多选框等。

    在 Form 组件中,每一个表单域由一个 Form-Item 组件构成,表单域中可以放置各种类型的表单控件,包括 Input、Select、Checkbox、Radio、Switch、DatePicker、TimePicker

    W3C 标准中有如下:

    即:当一个 form 元素中只有一个输入框时,在该输入框中按下回车应提交该表单。如果希望阻止这一默认行为,可以在 标签上添加 @submit.native.prevent

    行内表单

    当垂直方向空间受限且表单较简单时,可以在一行内放置表单。

    Form 表单 - 图2

    1. <el-form :inline="true" :model="formInline" class="demo-form-inline">
    2. <el-form-item label="审批人">
    3. <el-input v-model="formInline.user" placeholder="审批人"></el-input>
    4. </el-form-item>
    5. <el-form-item label="活动区域">
    6. <el-select v-model="formInline.region" placeholder="活动区域">
    7. <el-option label="区域一" value="shanghai"></el-option>
    8. <el-option label="区域二" value="beijing"></el-option>
    9. </el-select>
    10. </el-form-item>
    11. <el-form-item>
    12. <el-button type="primary" @click="onSubmit">查询</el-button>
    13. </el-form-item>
    14. </el-form>
    15. export default {
    16. data() {
    17. formInline: {
    18. user: '',
    19. region: ''
    20. }
    21. }
    22. },
    23. methods: {
    24. onSubmit() {
    25. console.log('submit!');
    26. }
    27. }
    28. </script>

    对齐方式

    根据具体目标和制约因素,选择最佳的标签对齐方式。

    通过设置 label-position 属性可以改变表单域标签的位置,可选值为 topleft,当设为 top 时标签会置于表单域的顶部

    表单验证

    在防止用户犯错的前提下,尽可能让用户更早地发现并纠正错误。

    Form 表单 - 图4

    Form 组件提供了表单验证的功能,只需要通过 rules 属性传入约定的验证规则,并将 Form-Item 的 prop 属性设置为需校验的字段名即可。校验规则参见

    
    

    自定义校验规则

    这个例子中展示了如何使用自定义验证规则来完成密码的二次验证。

    自定义校验 callback 必须被调用。 更多高级用法可参考 。

    Form 表单 - 图6

    除了在 Form 组件上一次性传递所有的验证规则外还可以在单个的表单域上传递属性的验证规则

    <el-form :model="dynamicValidateForm" ref="dynamicValidateForm" label-width="100px" class="demo-dynamic">
      <el-form-item
        prop="email"
        label="邮箱"
        :rules="[
          { required: true, message: '请输入邮箱地址', trigger: 'blur' },
          { type: 'email', message: '请输入正确的邮箱地址', trigger: ['blur', 'change'] }
        ]"
      >
        <el-input v-model="dynamicValidateForm.email"></el-input>
      </el-form-item>
      <el-form-item
        v-for="(domain, index) in dynamicValidateForm.domains"
        :label="'域名' + index"
        :key="domain.key"
        :prop="'domains.' + index + '.value'"
        :rules="{
          required: true, message: '域名不能为空', trigger: 'blur'
        }"
      >
        <el-input v-model="domain.value"></el-input><el-button @click.prevent="removeDomain(domain)">删除</el-button>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submitForm('dynamicValidateForm')">提交</el-button>
        <el-button @click="addDomain">新增域名</el-button>
        <el-button @click="resetForm('dynamicValidateForm')">重置</el-button>
      </el-form-item>
    </el-form>
    <script>
      export default {
        data() {
          return {
            dynamicValidateForm: {
              domains: [{
                value: ''
              }],
              email: ''
            }
          };
        },
        methods: {
          submitForm(formName) {
            this.$refs[formName].validate((valid) => {
              if (valid) {
                alert('submit!');
              } else {
                console.log('error submit!!');
                return false;
              }
            });
          },
          resetForm(formName) {
            this.$refs[formName].resetFields();
          },
          removeDomain(item) {
            var index = this.dynamicValidateForm.domains.indexOf(item)
            if (index !== -1) {
              this.dynamicValidateForm.domains.splice(index, 1)
            }
          },
          addDomain() {
            this.dynamicValidateForm.domains.push({
              value: '',
              key: Date.now()
            });
          }
        }
      }
    </script>
    

    数字类型验证

    数字类型的验证需要在 v-model 处加上 .number 的修饰符,这是 Vue 自身提供的用于将绑定值转化为 number 类型的修饰符。

    嵌套在 el-form-item 中的 el-form-item 标签宽度默认为零,不会继承 el-formlabel-width。如果需要可以为其单独设置 label-width 属性。

    表单内组件尺寸控制

    通过设置 Form 上的 size 属性可以使该表单内所有可调节大小的组件继承该尺寸。Form-Item 也具有该属性。

    Form 表单 - 图8

    <el-form ref="form" :model="sizeForm" label-width="80px" size="mini">
      <el-form-item label="活动名称">
        <el-input v-model="sizeForm.name"></el-input>
      </el-form-item>
      <el-form-item label="活动区域">
        <el-select v-model="sizeForm.region" placeholder="请选择活动区域">
          <el-option label="区域一" value="shanghai"></el-option>
          <el-option label="区域二" value="beijing"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="活动时间">
        <el-col :span="11">
          <el-date-picker type="date" placeholder="选择日期" v-model="sizeForm.date1" style="width: 100%;"></el-date-picker>
        </el-col>
        <el-col class="line" :span="2">-</el-col>
        <el-col :span="11">
          <el-time-picker placeholder="选择时间" v-model="sizeForm.date2" style="width: 100%;"></el-time-picker>
        </el-col>
      </el-form-item>
      <el-form-item label="活动性质">
        <el-checkbox-group v-model="sizeForm.type">
          <el-checkbox-button label="美食/餐厅线上活动" name="type"></el-checkbox-button>
          <el-checkbox-button label="地推活动" name="type"></el-checkbox-button>
          <el-checkbox-button label="线下主题活动" name="type"></el-checkbox-button>
        </el-checkbox-group>
      </el-form-item>
      <el-form-item label="特殊资源">
        <el-radio-group v-model="sizeForm.resource" size="medium">
          <el-radio border label="线上品牌商赞助"></el-radio>
          <el-radio border label="线下场地免费"></el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item size="large">
        <el-button type="primary" @click="onSubmit">立即创建</el-button>
        <el-button>取消</el-button>
      </el-form-item>
    </el-form>
    
    <script>
      export default {
        data() {
          return {
            sizeForm: {
              name: '',
              region: '',
              date1: '',
              date2: '',
              delivery: false,
              type: [],
              resource: '',
              desc: ''
            }
          };
        },
        methods: {
          onSubmit() {
            console.log('submit!');
          }
        }
      };
    </script>
    

    Form Attributes

    Form Methods

    方法名说明参数
    validate对整个表单进行校验的方法,参数为一个回调函数。该回调函数会在校验结束后被调用,并传入两个参数:是否校验成功和未通过校验的字段。若不传入回调函数,则会返回一个 promiseFunction(callback: Function(boolean, object))
    validateField对部分表单字段进行校验的方法Function(props: array | string, callback: Function(errorMessage: string))
    resetFields对整个表单进行重置,将所有字段值重置为初始值并移除校验结果
    clearValidate移除表单项的校验结果。传入待移除的表单项的 prop 属性或者 prop 组成的数组,如不传则移除整个表单的校验结果Function(props: array | string)

    Form-Item Attributes

    参数说明类型可选值默认值
    prop表单域 model 字段,在使用 validate、resetFields 方法的情况下,该属性是必填的string传入 Form 组件的 model 中的字段
    label标签文本string
    label-width表单域标签的的宽度,例如 '50px'。支持 。string
    required是否必填,如不设置,则会根据校验规则自动生成booleanfalse
    rules表单验证规则object
    error表单域验证错误信息, 设置该值会使表单验证状态变为error,并显示该错误信息string
    show-message是否显示校验错误信息booleantrue
    inline-message以行内形式展示校验信息booleanfalse
    size用于控制该表单域下组件的尺寸stringmedium / small / mini-

    Form-Item Slot

    Form-Item Scoped Slot

    name说明
    error自定义表单校验信息的显示方式,参数为 { error }

    Form-Item Methods