由輸入框、選擇器、單選框、多選框等控件組成,用以收集、校驗(yàn)、提交數(shù)據(jù)
組件升級(jí)采用了 flex 布局,以替代舊版本的 float 布局。
包括各種表單項(xiàng),比如輸入框、選擇器、開關(guān)、單選框、多選框等。
在 Form 組件中,每一個(gè)表單域由一個(gè) Form-Item 組件構(gòu)成,表單域中可以放置各種類型的表單控件,包括 Input、Select、Checkbox、Radio、Switch、DatePicker、TimePicker
<template>
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="活動(dòng)名稱">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="活動(dòng)區(qū)域">
<el-select v-model="form.region" placeholder="請選擇活動(dòng)區(qū)域">
<el-option label="區(qū)域一" value="shanghai"></el-option>
<el-option label="區(qū)域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item label="活動(dòng)時(shí)間">
<el-col :span="11">
<el-date-picker
type="date"
placeholder="選擇日期"
v-model="form.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="選擇時(shí)間"
v-model="form.date2"xx`
style="width: 100%;"
></el-time-picker>
</el-col>
</el-form-item>
<el-form-item label="即時(shí)配送">
<el-switch v-model="form.delivery"></el-switch>
</el-form-item>
<el-form-item label="活動(dòng)性質(zhì)">
<el-checkbox-group v-model="form.type">
<el-checkbox label="美食/餐廳線上活動(dòng)" name="type"></el-checkbox>
<el-checkbox label="地推活動(dòng)" name="type"></el-checkbox>
<el-checkbox label="線下主題活動(dòng)" name="type"></el-checkbox>
<el-checkbox label="單純品牌曝光" name="type"></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="特殊資源">
<el-radio-group v-model="form.resource">
<el-radio label="線上品牌商贊助"></el-radio>
<el-radio label="線下場地免費(fèi)"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="活動(dòng)形式">
<el-input type="textarea" v-model="form.desc"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">立即創(chuàng)建</el-button>
<el-button>取消</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
form: {
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
desc: '',
},
}
},
methods: {
onSubmit() {
console.log('submit!')
},
},
}
</script>
W3C 標(biāo)準(zhǔn)中有如下規(guī)定
When there is only one single-line text input field in a form, the user agent should accept Enter in that field as a request to submit the form.
即:當(dāng)一個(gè) form 元素中只有一個(gè)輸入框時(shí),在該輸入框中按下回車應(yīng)提交該表單。如果希望阻止這一默認(rèn)行為,可以在 <el-form>
標(biāo)簽上添加 @submit.prevent
。
當(dāng)垂直方向空間受限且表單較簡單時(shí),可以在一行內(nèi)放置表單。
設(shè)置 inline
屬性可以讓表單域變?yōu)樾袃?nèi)的表單域
<template>
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-form-item label="審批人">
<el-input v-model="formInline.user" placeholder="審批人"></el-input>
</el-form-item>
<el-form-item label="活動(dòng)區(qū)域">
<el-select v-model="formInline.region" placeholder="活動(dòng)區(qū)域">
<el-option label="區(qū)域一" value="shanghai"></el-option>
<el-option label="區(qū)域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查詢</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
formInline: {
user: '',
region: '',
},
}
},
methods: {
onSubmit() {
console.log('submit!')
},
},
}
</script>
根據(jù)具體目標(biāo)和制約因素,選擇最佳的標(biāo)簽對(duì)齊方式。
通過設(shè)置 label-position
屬性可以改變表單域標(biāo)簽的位置,可選值為 top
、left
,當(dāng)設(shè)為 top
時(shí)標(biāo)簽會(huì)置于表單域的頂部
<template>
<el-radio-group v-model="labelPosition" size="small">
<el-radio-button label="left">左對(duì)齊</el-radio-button>
<el-radio-button label="right">右對(duì)齊</el-radio-button>
<el-radio-button label="top">頂部對(duì)齊</el-radio-button>
</el-radio-group>
<div style="margin: 20px;"></div>
<el-form
:label-position="labelPosition"
label-width="80px"
:model="formLabelAlign"
>
<el-form-item label="名稱">
<el-input v-model="formLabelAlign.name"></el-input>
</el-form-item>
<el-form-item label="活動(dòng)區(qū)域">
<el-input v-model="formLabelAlign.region"></el-input>
</el-form-item>
<el-form-item label="活動(dòng)形式">
<el-input v-model="formLabelAlign.type"></el-input>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
labelPosition: 'right',
formLabelAlign: {
name: '',
region: '',
type: '',
},
}
},
}
</script>
在防止用戶犯錯(cuò)的前提下,盡可能讓用戶更早地發(fā)現(xiàn)并糾正錯(cuò)誤。
Form 組件提供了表單驗(yàn)證的功能,只需要通過 rules
屬性傳入約定的驗(yàn)證規(guī)則,并將 Form-Item 的 prop
屬性設(shè)置為需校驗(yàn)的字段名即可。校驗(yàn)規(guī)則見 async-validator
<template>
<el-form
:model="ruleForm"
:rules="rules"
ref="ruleForm"
label-width="100px"
class="demo-ruleForm"
>
<el-form-item label="活動(dòng)名稱" prop="name">
<el-input v-model="ruleForm.name"></el-input>
</el-form-item>
<el-form-item label="活動(dòng)區(qū)域" prop="region">
<el-select v-model="ruleForm.region" placeholder="請選擇活動(dòng)區(qū)域">
<el-option label="區(qū)域一" value="shanghai"></el-option>
<el-option label="區(qū)域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item label="活動(dòng)時(shí)間" required>
<el-col :span="11">
<el-form-item prop="date1">
<el-date-picker
type="date"
placeholder="選擇日期"
v-model="ruleForm.date1"
style="width: 100%;"
></el-date-picker>
</el-form-item>
</el-col>
<el-col class="line" :span="2">-</el-col>
<el-col :span="11">
<el-form-item prop="date2">
<el-time-picker
placeholder="選擇時(shí)間"
v-model="ruleForm.date2"
style="width: 100%;"
></el-time-picker>
</el-form-item>
</el-col>
</el-form-item>
<el-form-item label="即時(shí)配送" prop="delivery">
<el-switch v-model="ruleForm.delivery"></el-switch>
</el-form-item>
<el-form-item label="活動(dòng)性質(zhì)" prop="type">
<el-checkbox-group v-model="ruleForm.type">
<el-checkbox label="美食/餐廳線上活動(dòng)" name="type"></el-checkbox>
<el-checkbox label="地推活動(dòng)" name="type"></el-checkbox>
<el-checkbox label="線下主題活動(dòng)" name="type"></el-checkbox>
<el-checkbox label="單純品牌曝光" name="type"></el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="特殊資源" prop="resource">
<el-radio-group v-model="ruleForm.resource">
<el-radio label="線上品牌商贊助"></el-radio>
<el-radio label="線下場地免費(fèi)"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="活動(dòng)形式" prop="desc">
<el-input type="textarea" v-model="ruleForm.desc"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')"
>立即創(chuàng)建</el-button
>
<el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
ruleForm: {
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
desc: '',
},
rules: {
name: [
{ required: true, message: '請輸入活動(dòng)名稱', trigger: 'blur' },
{
min: 3,
max: 5,
message: '長度在 3 到 5 個(gè)字符',
trigger: 'blur',
},
],
region: [
{ required: true, message: '請選擇活動(dòng)區(qū)域', trigger: 'change' },
],
date1: [
{
type: 'date',
required: true,
message: '請選擇日期',
trigger: 'change',
},
],
date2: [
{
type: 'date',
required: true,
message: '請選擇時(shí)間',
trigger: 'change',
},
],
type: [
{
type: 'array',
required: true,
message: '請至少選擇一個(gè)活動(dòng)性質(zhì)',
trigger: 'change',
},
],
resource: [
{ required: true, message: '請選擇活動(dòng)資源', trigger: 'change' },
],
desc: [
{ required: true, message: '請?zhí)顚懟顒?dòng)形式', trigger: 'blur' },
],
},
}
},
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()
},
},
}
</script>
這個(gè)例子中展示了如何使用自定義驗(yàn)證規(guī)則來完成密碼的二次驗(yàn)證。
本例還使用status-icon
屬性為輸入框添加了表示校驗(yàn)結(jié)果的反饋圖標(biāo)。
<template>
<el-form
:model="ruleForm"
status-icon
:rules="rules"
ref="ruleForm"
label-width="100px"
class="demo-ruleForm"
>
<el-form-item label="密碼" prop="pass">
<el-input
type="password"
v-model="ruleForm.pass"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="確認(rèn)密碼" prop="checkPass">
<el-input
type="password"
v-model="ruleForm.checkPass"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="年齡" prop="age">
<el-input v-model.number="ruleForm.age"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('ruleForm')">提交</el-button>
<el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
var checkAge = (rule, value, callback) => {
if (!value) {
return callback(new Error('年齡不能為空'))
}
setTimeout(() => {
if (!Number.isInteger(value)) {
callback(new Error('請輸入數(shù)字值'))
} else {
if (value < 18) {
callback(new Error('必須年滿18歲'))
} else {
callback()
}
}
}, 1000)
}
var validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('請輸入密碼'))
} else {
if (this.ruleForm.checkPass !== '') {
this.$refs.ruleForm.validateField('checkPass')
}
callback()
}
}
var validatePass2 = (rule, value, callback) => {
if (value === '') {
callback(new Error('請?jiān)俅屋斎朊艽a'))
} else if (value !== this.ruleForm.pass) {
callback(new Error('兩次輸入密碼不一致!'))
} else {
callback()
}
}
return {
ruleForm: {
pass: '',
checkPass: '',
age: '',
},
rules: {
pass: [{ validator: validatePass, trigger: 'blur' }],
checkPass: [{ validator: validatePass2, trigger: 'blur' }],
age: [{ validator: checkAge, trigger: 'blur' }],
},
}
},
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()
},
},
}
</script>
自定義校驗(yàn) callback 必須被調(diào)用。 更多高級(jí)用法可參考 async-validator。
除了在 Form 組件上一次性傳遞所有的驗(yàn)證規(guī)則外還可以在單個(gè)的表單域上傳遞屬性的驗(yàn)證規(guī)則
<template>
<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>
</template>
<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>
數(shù)字類型的驗(yàn)證需要在 v-model
處加上 .number
的修飾符,這是 Vue
自身提供的用于將綁定值轉(zhuǎn)化為 number
類型的修飾符。
<template>
<el-form
:model="numberValidateForm"
ref="numberValidateForm"
label-width="100px"
class="demo-ruleForm"
>
<el-form-item
label="年齡"
prop="age"
:rules="[
{ required: true, message: '年齡不能為空'},
{ type: 'number', message: '年齡必須為數(shù)字值'}
]"
>
<el-input
type="age"
v-model.number="numberValidateForm.age"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm('numberValidateForm')"
>提交</el-button
>
<el-button @click="resetForm('numberValidateForm')">重置</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
numberValidateForm: {
age: '',
},
}
},
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()
},
},
}
</script>
嵌套在 el-form-item
中的 el-form-item
標(biāo)簽寬度默認(rèn)為零,不會(huì)繼承 el-form
的 label-width
。如果需要可以為其單獨(dú)設(shè)置 label-width
屬性。
通過設(shè)置 Form 上的 size
屬性可以使該表單內(nèi)所有可調(diào)節(jié)大小的組件繼承該尺寸。Form-Item 也具有該屬性。
如果希望某個(gè)表單項(xiàng)或某個(gè)表單組件的尺寸不同于 Form 上的size
屬性,直接為這個(gè)表單項(xiàng)或表單組件設(shè)置自己的size
即可。
<template>
<el-form ref="form" :model="sizeForm" label-width="80px" size="mini">
<el-form-item label="活動(dòng)名稱">
<el-input v-model="sizeForm.name"></el-input>
</el-form-item>
<el-form-item label="活動(dòng)區(qū)域">
<el-select v-model="sizeForm.region" placeholder="請選擇活動(dòng)區(qū)域">
<el-option label="區(qū)域一" value="shanghai"></el-option>
<el-option label="區(qū)域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item label="活動(dòng)時(shí)間">
<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="選擇時(shí)間"
v-model="sizeForm.date2"
style="width: 100%;"
></el-time-picker>
</el-col>
</el-form-item>
<el-form-item label="活動(dòng)性質(zhì)">
<el-checkbox-group v-model="sizeForm.type">
<el-checkbox-button
label="美食/餐廳線上活動(dòng)"
name="type"
></el-checkbox-button>
<el-checkbox-button label="地推活動(dòng)" name="type"></el-checkbox-button>
<el-checkbox-button label="線下主題活動(dòng)" 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="線下場地免費(fèi)"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item size="large">
<el-button type="primary" @click="onSubmit">立即創(chuàng)建</el-button>
<el-button>取消</el-button>
</el-form-item>
</el-form>
</template>
<script>
export default {
data() {
return {
sizeForm: {
name: '',
region: '',
date1: '',
date2: '',
delivery: false,
type: [],
resource: '',
desc: '',
},
}
},
methods: {
onSubmit() {
console.log('submit!')
},
},
}
</script>
參數(shù) | 說明 | 類型 | 可選值 | 默認(rèn)值 |
---|---|---|---|---|
model | 表單數(shù)據(jù)對(duì)象 | object | — | — |
rules | 表單驗(yàn)證規(guī)則 | object | — | — |
inline | 行內(nèi)表單模式 | boolean | — | false |
label-position | 表單域標(biāo)簽的位置,如果值為 left 或者 right 時(shí),則需要設(shè)置 label-width | string | right / left / top | right |
label-width | 表單域標(biāo)簽的寬度,例如 '50px'。作為 Form 直接子元素的 form-item 會(huì)繼承該值。支持 auto 。 | string / number | — | — |
label-suffix | 表單域標(biāo)簽的后綴 | string | — | — |
hide-required-asterisk | 是否顯示必填字段的標(biāo)簽旁邊的紅色星號(hào) | boolean | — | false |
show-message | 是否顯示校驗(yàn)錯(cuò)誤信息 | boolean | — | true |
inline-message | 是否以行內(nèi)形式展示校驗(yàn)信息 | boolean | — | false |
status-icon | 是否在輸入框中顯示校驗(yàn)結(jié)果反饋圖標(biāo) | boolean | — | false |
validate-on-rule-change | 是否在 rules 屬性改變后立即觸發(fā)一次驗(yàn)證 | boolean | — | true |
size | 用于控制該表單內(nèi)組件的尺寸 | string | medium / small / mini | — |
disabled | 是否禁用該表單內(nèi)的所有組件。若設(shè)置為 true,則表單內(nèi)組件上的 disabled 屬性不再生效 | boolean | — | false |
方法名 | 說明 | 參數(shù) |
---|---|---|
validate | 對(duì)整個(gè)表單進(jìn)行校驗(yàn)的方法,參數(shù)為一個(gè)回調(diào)函數(shù)。該回調(diào)函數(shù)會(huì)在校驗(yàn)結(jié)束后被調(diào)用,并傳入兩個(gè)參數(shù):是否校驗(yàn)成功和未通過校驗(yàn)的字段。若不傳入回調(diào)函數(shù),則會(huì)返回一個(gè) promise | Function(callback: Function(boolean, object)) |
validateField | 對(duì)部分表單字段進(jìn)行校驗(yàn)的方法 | Function(props: array | string, callback: Function(errorMessage: string)) |
resetFields | 對(duì)整個(gè)表單進(jìn)行重置,將所有字段值重置為初始值并移除校驗(yàn)結(jié)果 | — |
scrollToField | 滾動(dòng)到指定表單字段 | Function(prop: string) |
clearValidate | 移除表單項(xiàng)的校驗(yàn)結(jié)果。傳入待移除的表單項(xiàng)的 prop 屬性或者 prop 組成的數(shù)組,如不傳則移除整個(gè)表單的校驗(yàn)結(jié)果 | Function(props: array | string) |
事件名稱 | 說明 | 回調(diào)參數(shù) |
---|---|---|
validate | 任一表單項(xiàng)被校驗(yàn)后觸發(fā) | 被校驗(yàn)的表單項(xiàng) prop 值,校驗(yàn)是否通過,錯(cuò)誤消息(如果存在) |
參數(shù) | 說明 | 類型 | 可選值 | 默認(rèn)值 |
---|---|---|---|---|
prop | 表單域 model 字段,在使用 validate、resetFields 方法的情況下,該屬性是必填的 | string | 傳入 Form 組件的 model 中的字段 | — |
label | 標(biāo)簽文本 | string | — | — |
label-width | 表單域標(biāo)簽的的寬度,例如 '50px'。支持 auto 。 | string / number | — | — |
required | 是否必填,如不設(shè)置,則會(huì)根據(jù)校驗(yàn)規(guī)則自動(dòng)生成 | boolean | — | false |
rules | 表單驗(yàn)證規(guī)則, 具體配置見下表, 更多內(nèi)容參考async-validator | object / array | — | — |
error | 表單域驗(yàn)證錯(cuò)誤信息, 設(shè)置該值會(huì)使表單驗(yàn)證狀態(tài)變?yōu)?code>error,并顯示該錯(cuò)誤信息 | string | — | — |
show-message | 是否顯示校驗(yàn)錯(cuò)誤信息 | boolean | — | true |
inline-message | 以行內(nèi)形式展示校驗(yàn)信息 | boolean | — | false |
size | 用于控制該表單域下組件的尺寸 | string | medium / small / mini | — |
參數(shù) | 說明 | 類型 | 可選值 | 默認(rèn)值 |
---|---|---|---|---|
trigger | 驗(yàn)證觸發(fā)方式 | string | blur / change | — |
name | 說明 |
---|---|
— | Form Item 的內(nèi)容 |
label | 自定義標(biāo)簽,參數(shù)為 { label } |
error | 自定義表單校驗(yàn)信息的顯示方式,參數(shù)為 { error } |
方法名 | 說明 | 參數(shù) |
---|---|---|
resetField | 對(duì)該表單項(xiàng)進(jìn)行重置,將其值重置為初始值并移除校驗(yàn)結(jié)果 | — |
clearValidate | 移除該表單項(xiàng)的校驗(yàn)結(jié)果 | — |
更多建議: