学习文档: https://www.youbaobao.xyz/admin-docs/guide/base/element.html#%E8%A1%A8%E5%8D%95%E6%A0%A1%E9%AA%8C%E5%9F%BA%E6%9C%AC%E7%94%A8%E6%B3%95
element-ui文档: form
表单基本用法
- el-form 容器,通过 model 绑定数据
- el-form-item 容器,通过 label 绑定标签
- 表单组件通过 v-model 绑定 model 中的数据
<template>
<div id="app">
<el-form inline :model="data">
<el-form-item label="审批人">
<el-input v-model="data.user" placeholder="审批人"></el-input>
</el-form-item>
<el-form-item label="活动区域">
<el-select v-model="data.region" placeholder="活动区域">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" 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>
</div>
</template>
<script>
export default {
name: 'app',
data() {
return {
data: {
user: 'sam',
region: '区域二'
}
}
},
methods: {
onSubmit() {
console.log(this.data)
}
}
}
</script>
其它表单控件
<el-form-item label="活动时间">
<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="选择时间" v-model="form.date2" style="width: 100%;"></el-time-picker>
</el-col>
</el-form-item>
<el-form-item label="即时配送">
<el-switch v-model="form.delivery"></el-switch>
</el-form-item>
<el-form-item label="活动性质">
<el-checkbox-group v-model="form.type">
<el-checkbox label="美食/餐厅线上活动" name="type"></el-checkbox>
<el-checkbox label="地推活动" name="type"></el-checkbox>
<el-checkbox label="线下主题活动" 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="线下场地免费"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="活动形式">
<el-input type="textarea" v-model="form.desc"></el-input>
</el-form-item>
表单属性
- label-position:标签位置,枚举值,left 和 top
- label-width:标签宽度
- label-suffix:标签后缀
- inline:行内表单
- disabled: 设置整个 form 中的表单组件全部 disabled,优先级低于表单组件自身的 disabled
/* el-input 源码 */ inputDisabled() { return this.disabled || (this.elForm || {}).disabled; }
- size:设置表单组件尺寸
/* el-input */ inputSize() { return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size; }, _elFormItemSize() { return (this.elFormItem || {}).elFormItemSize; } /* el-form-item */ elFormItemSize() { return this.size || this._formSize; }, _formSize() { return this.elForm.size; }
- hide-required-asterisk: 是否隐藏必填字段的标签旁边的红色星号, 默认false
- show-message: 是否显示校验错误信息,默认 true
表单方法
- resetFields():对整个表单进行重置,将所有字段值重置为初始值并移除校验结果
<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: '年龄必须为数字值'} ]" > <el-input 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> <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 或 el-form-item
data() { const userValidator = (rule, value, callback) => { if (value.length > 3) { callback() } else { callback(new Error('用户名长度必须大于3')) } } return { data: { user: 'sam', region: '区域二' }, rules: { user: [ { required: true, trigger: 'change', message: '用户名必须录入' }, { validator: userValidator, trigger: 'change' } ] } } }
- 指定 el-form-item 的 prop 属性
<el-form-item label="审批人" prop="user"> <el-input v-model="data.user" placeholder="审批人" clearable></el-input> </el-form-item>
表单校验相关属性
- hide-required-asterisk:隐藏必录标识
- inline-message:验证消息是否在一行显示
表单校验高级用法
用法一:动态改变校验规则
- rules 只包含一个校验规则
{ rules: { user: [ { required: true, trigger: 'change', message: '用户名必须录入' }, ] } }
- 动态添加 rules
addRule() { const userValidator = (rule, value, callback) => { if (value.length > 3) { this.inputError = '' this.inputValidateStatus = '' callback() } else { callback(new Error('用户名长度必须大于3')) } } const newRule = [ ...this.rules.user, { validator: userValidator, trigger: 'change' } ] this.rules = Object.assign({}, this.rules, { user: newRule }) }
用法二:手动控制校验状态
validate-status:验证状态,枚举值,共四种:
- success:验证成功
- error:验证失败
- validating:验证中
- (空):未验证
error:自定义错误提示
- 设置 el-form-item 属性
<el-form-item label="用户名" prop="user" :error="error" :validate-status="status" > <!-- ... --> </el-form-item>
- 自定义 status 和 error
showError() { this.status = 'error' this.error = '用户名输入有误' }, showSuccess() { this.status = 'success' this.error = '' }, showValidating() { this.status = 'validating' this.error = '' }
案例
<template>
<div id="app">
<el-form
:model="data"
style="width: 500px"
label-position="left"
label-width="100px"
label-suffix=":"
:inline="false"
:rules="rules"
:disabled="false"
status-icon
validate-on-rule-change
hide-required-asterisk
:inline-message="false"
>
<el-form-item
label="用户名"
prop="user"
:error="error"
:validate-status="status"
>
<el-input v-model="data.user" placeholder="用户名" clearable></el-input>
</el-form-item>
<el-form-item label="活动区域" prop="region">
<el-select v-model="data.region" placeholder="活动区域" style="width:100%">
<el-option label="区域一" value="shanghai"></el-option>
<el-option label="区域二" value="beijing"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
<el-button type="primary" @click="addRule">添加校验规则</el-button>
<el-button @click="showError">错误状态</el-button>
<el-button @click="showSuccess">正确状态</el-button>
<el-button @click="showValidating">验证状态</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
name: 'app',
data() {
return {
data: {
user: 'sam',
region: '区域二'
},
error: '',
status: '',
rules: {
user: [
{ required: true, trigger: 'change', message: '用户名必须录入' }
]
}
}
},
methods: {
/* eslint-disable */
onSubmit() {
console.log(this.data)
},
addRule() {
const userValidator = (rule, value, callback) => {
if (value.length > 3) {
this.inputError = ''
this.inputValidateStatus = ''
callback()
} else {
callback(new Error('用户名长度必须大于3'))
}
}
const newRule = [
...this.rules.user,
{ validator: userValidator, trigger: 'change' }
]
this.rules = Object.assign({}, this.rules, { user: newRule })
},
showError() {
this.status = 'error'
this.error = '用户名输入有误'
},
showSuccess() {
this.status = 'success'
this.error = ''
},
showValidating() {
this.status = 'validating'
this.error = ''
}
}
}
</script>