mirror of
https://gitee.com/ElemeFE/element.git
synced 2024-12-03 20:58:09 +08:00
878 lines
26 KiB
Markdown
878 lines
26 KiB
Markdown
|
<script>
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
var checkAge = (rule, value, callback) => {
|
|||
|
if (!value) {
|
|||
|
return callback(new Error('Please input the age'));
|
|||
|
}
|
|||
|
setTimeout(() => {
|
|||
|
if (!Number.isInteger(value)) {
|
|||
|
callback(new Error('Please input digits'));
|
|||
|
} else {
|
|||
|
if (value < 18) {
|
|||
|
callback(new Error('Age must be greater than 18'));
|
|||
|
} else {
|
|||
|
callback();
|
|||
|
}
|
|||
|
}
|
|||
|
}, 1000);
|
|||
|
};
|
|||
|
var validatePass = (rule, value, callback) => {
|
|||
|
if (value === '') {
|
|||
|
callback(new Error('Please input the password'));
|
|||
|
} else {
|
|||
|
if (this.ruleForm2.checkPass !== '') {
|
|||
|
this.$refs.ruleForm2.validateField('checkPass');
|
|||
|
}
|
|||
|
callback();
|
|||
|
}
|
|||
|
};
|
|||
|
var validatePass2 = (rule, value, callback) => {
|
|||
|
if (value === '') {
|
|||
|
callback(new Error('Please input the password again'));
|
|||
|
} else if (value !== this.ruleForm2.pass) {
|
|||
|
callback(new Error('Two inputs don\'t match!'));
|
|||
|
} else {
|
|||
|
callback();
|
|||
|
}
|
|||
|
};
|
|||
|
return {
|
|||
|
form: {
|
|||
|
name: '',
|
|||
|
region: '',
|
|||
|
date1: '',
|
|||
|
date2: '',
|
|||
|
delivery: false,
|
|||
|
type: [],
|
|||
|
resource: '',
|
|||
|
desc: ''
|
|||
|
},
|
|||
|
sizeForm: {
|
|||
|
name: '',
|
|||
|
region: '',
|
|||
|
date1: '',
|
|||
|
date2: '',
|
|||
|
delivery: false,
|
|||
|
type: [],
|
|||
|
resource: '',
|
|||
|
desc: ''
|
|||
|
},
|
|||
|
formInline: {
|
|||
|
user: '',
|
|||
|
region: ''
|
|||
|
},
|
|||
|
labelPosition: 'right',
|
|||
|
formLabelAlign: {
|
|||
|
name: '',
|
|||
|
region: '',
|
|||
|
type: ''
|
|||
|
},
|
|||
|
ruleForm: {
|
|||
|
name: '',
|
|||
|
region: '',
|
|||
|
date1: '',
|
|||
|
date2: '',
|
|||
|
delivery: false,
|
|||
|
type: [],
|
|||
|
resource: '',
|
|||
|
desc: ''
|
|||
|
},
|
|||
|
ruleForm2: {
|
|||
|
pass: '',
|
|||
|
checkPass: '',
|
|||
|
age: ''
|
|||
|
},
|
|||
|
formLabelWidth: '80px',
|
|||
|
options: [
|
|||
|
],
|
|||
|
rules: {
|
|||
|
name: [
|
|||
|
{ required: true, message: 'Please input Activity name', trigger: 'blur' },
|
|||
|
{ min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' }
|
|||
|
],
|
|||
|
region: [
|
|||
|
{ required: true, message: 'Please select Activity zone', trigger: 'change' }
|
|||
|
],
|
|||
|
date1: [
|
|||
|
{ type: 'date', required: true, message: 'Please pick a date', trigger: 'change' }
|
|||
|
],
|
|||
|
date2: [
|
|||
|
{ type: 'date', required: true, message: 'Please pick a time', trigger: 'change' }
|
|||
|
],
|
|||
|
type: [
|
|||
|
{ type: 'array', required: true, message: 'Please select at least one activity type', trigger: 'change' }
|
|||
|
],
|
|||
|
resource: [
|
|||
|
{ required: true, message: 'Please select activity resource', trigger: 'change' }
|
|||
|
],
|
|||
|
desc: [
|
|||
|
{ required: true, message: 'Please input activity form', trigger: 'blur' }
|
|||
|
]
|
|||
|
},
|
|||
|
rules2: {
|
|||
|
pass: [
|
|||
|
{ validator: validatePass, trigger: 'blur' }
|
|||
|
],
|
|||
|
checkPass: [
|
|||
|
{ validator: validatePass2, trigger: 'blur' }
|
|||
|
],
|
|||
|
age: [
|
|||
|
{ validator: checkAge, trigger: 'blur' }
|
|||
|
]
|
|||
|
},
|
|||
|
dynamicValidateForm: {
|
|||
|
domains: [{
|
|||
|
key: Date.now(),
|
|||
|
value: ''
|
|||
|
}],
|
|||
|
email: ''
|
|||
|
},
|
|||
|
numberValidateForm: {
|
|||
|
age: ''
|
|||
|
}
|
|||
|
};
|
|||
|
},
|
|||
|
methods: {
|
|||
|
onSubmit() {
|
|||
|
console.log('submit!');
|
|||
|
},
|
|||
|
onRuleFormSubmit() {
|
|||
|
console.log('onRuleFormSubmit');
|
|||
|
},
|
|||
|
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({
|
|||
|
key: Date.now(),
|
|||
|
value: ''
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
|
|||
|
<style>
|
|||
|
.demo-form.demo-en-US {
|
|||
|
.el-select .el-input {
|
|||
|
width: 360px;
|
|||
|
}
|
|||
|
.el-form {
|
|||
|
width: 480px;
|
|||
|
}
|
|||
|
|
|||
|
.line {
|
|||
|
text-align: center;
|
|||
|
}
|
|||
|
|
|||
|
.el-checkbox-group {
|
|||
|
width: 320px;
|
|||
|
margin: 0;
|
|||
|
padding: 0;
|
|||
|
list-style: none;
|
|||
|
|
|||
|
&:after, &:before {
|
|||
|
content: ' ';
|
|||
|
display: table;
|
|||
|
}
|
|||
|
&:after {
|
|||
|
clear: both;
|
|||
|
visibility: hidden;
|
|||
|
font-size: 0;
|
|||
|
height: 0;
|
|||
|
}
|
|||
|
|
|||
|
.el-checkbox {
|
|||
|
float: left;
|
|||
|
width: 160px;
|
|||
|
padding-right: 20px;
|
|||
|
margin: 0;
|
|||
|
padding: 0;
|
|||
|
|
|||
|
+ .el-checkbox {
|
|||
|
margin-left: 0;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
.demo-form-normal {
|
|||
|
width: 480px;
|
|||
|
}
|
|||
|
.demo-form-inline {
|
|||
|
width: auto;
|
|||
|
|
|||
|
.el-input {
|
|||
|
width: 150px;
|
|||
|
}
|
|||
|
> * {
|
|||
|
margin-right: 10px;
|
|||
|
}
|
|||
|
}
|
|||
|
.demo-ruleForm {
|
|||
|
width: 480px;
|
|||
|
|
|||
|
.el-select .el-input {
|
|||
|
width: 360px;
|
|||
|
}
|
|||
|
}
|
|||
|
.demo-dynamic {
|
|||
|
.el-input {
|
|||
|
margin-right: 10px;
|
|||
|
width: 270px;
|
|||
|
vertical-align: top;
|
|||
|
}
|
|||
|
}
|
|||
|
.fr {
|
|||
|
float: right;
|
|||
|
}
|
|||
|
}
|
|||
|
</style>
|
|||
|
|
|||
|
## Form
|
|||
|
|
|||
|
Form consists of `input`, `radio`, `select`, `checkbox` and so on. With form, you can collect, verify and submit data.
|
|||
|
|
|||
|
### Basic form
|
|||
|
|
|||
|
It includes all kinds of input items, such as `input`, `select`, `radio` and `checkbox`.
|
|||
|
|
|||
|
:::demo In each `form` component, you need a `form-item` field to be the container of your input item.
|
|||
|
|
|||
|
```html
|
|||
|
<el-form ref="form" :model="form" label-width="120px">
|
|||
|
<el-form-item label="Activity name">
|
|||
|
<el-input v-model="form.name"></el-input>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity zone">
|
|||
|
<el-select v-model="form.region" placeholder="please select your zone">
|
|||
|
<el-option label="Zone one" value="shanghai"></el-option>
|
|||
|
<el-option label="Zone two" value="beijing"></el-option>
|
|||
|
</el-select>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity time">
|
|||
|
<el-col :span="11">
|
|||
|
<el-date-picker type="date" placeholder="Pick a date" 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 type="fixed-time" placeholder="Pick a time" v-model="form.date2" style="width: 100%;"></el-time-picker>
|
|||
|
</el-col>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Instant delivery">
|
|||
|
<el-switch v-model="form.delivery"></el-switch>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity type">
|
|||
|
<el-checkbox-group v-model="form.type">
|
|||
|
<el-checkbox label="Online activities" name="type"></el-checkbox>
|
|||
|
<el-checkbox label="Promotion activities" name="type"></el-checkbox>
|
|||
|
<el-checkbox label="Offline activities" name="type"></el-checkbox>
|
|||
|
<el-checkbox label="Simple brand exposure" name="type"></el-checkbox>
|
|||
|
</el-checkbox-group>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Resources">
|
|||
|
<el-radio-group v-model="form.resource">
|
|||
|
<el-radio label="Sponsor"></el-radio>
|
|||
|
<el-radio label="Venue"></el-radio>
|
|||
|
</el-radio-group>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity form">
|
|||
|
<el-input type="textarea" v-model="form.desc"></el-input>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item>
|
|||
|
<el-button type="primary" @click="onSubmit">Create</el-button>
|
|||
|
<el-button>Cancel</el-button>
|
|||
|
</el-form-item>
|
|||
|
</el-form>
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
return {
|
|||
|
form: {
|
|||
|
name: '',
|
|||
|
region: '',
|
|||
|
date1: '',
|
|||
|
date2: '',
|
|||
|
delivery: false,
|
|||
|
type: [],
|
|||
|
resource: '',
|
|||
|
desc: ''
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
methods: {
|
|||
|
onSubmit() {
|
|||
|
console.log('submit!');
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
```
|
|||
|
:::
|
|||
|
|
|||
|
:::tip
|
|||
|
[W3C](https://www.w3.org/MarkUp/html-spec/html-spec_8.html#SEC8.2) regulates that
|
|||
|
> <i>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.</i>
|
|||
|
|
|||
|
To prevent this behavior, you can add `@submit.native.prevent` on `<el-form>`.
|
|||
|
:::
|
|||
|
|
|||
|
### Inline form
|
|||
|
|
|||
|
When the vertical space is limited and the form is relatively simple, you can put it in one line.
|
|||
|
|
|||
|
:::demo Set the `inline` attribute to `true` and the form will be inline.
|
|||
|
|
|||
|
```html
|
|||
|
<el-form :inline="true" :model="formInline" class="demo-form-inline">
|
|||
|
<el-form-item label="Approved by">
|
|||
|
<el-input v-model="formInline.user" placeholder="Approved by"></el-input>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity zone">
|
|||
|
<el-select v-model="formInline.region" placeholder="Activity zone">
|
|||
|
<el-option label="Zone one" value="shanghai"></el-option>
|
|||
|
<el-option label="Zone two" value="beijing"></el-option>
|
|||
|
</el-select>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item>
|
|||
|
<el-button type="primary" @click="onSubmit">Query</el-button>
|
|||
|
</el-form-item>
|
|||
|
</el-form>
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
return {
|
|||
|
formInline: {
|
|||
|
user: '',
|
|||
|
region: ''
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
methods: {
|
|||
|
onSubmit() {
|
|||
|
console.log('submit!');
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
```
|
|||
|
:::
|
|||
|
|
|||
|
### Alignment
|
|||
|
|
|||
|
Depending on your design, there are several different ways to align your label element.
|
|||
|
|
|||
|
:::demo The `label-position` attribute decides how labels align, it can be `top` or `left`. When set to `top`, labels will be placed at the top of the form field.
|
|||
|
|
|||
|
```html
|
|||
|
<el-radio-group v-model="labelPosition" size="small">
|
|||
|
<el-radio-button label="left">Left</el-radio-button>
|
|||
|
<el-radio-button label="right">Right</el-radio-button>
|
|||
|
<el-radio-button label="top">Top</el-radio-button>
|
|||
|
</el-radio-group>
|
|||
|
<div style="margin: 20px;"></div>
|
|||
|
<el-form :label-position="labelPosition" label-width="100px" :model="formLabelAlign">
|
|||
|
<el-form-item label="Name">
|
|||
|
<el-input v-model="formLabelAlign.name"></el-input>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity zone">
|
|||
|
<el-input v-model="formLabelAlign.region"></el-input>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity form">
|
|||
|
<el-input v-model="formLabelAlign.type"></el-input>
|
|||
|
</el-form-item>
|
|||
|
</el-form>
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
return {
|
|||
|
labelPosition: 'right',
|
|||
|
formLabelAlign: {
|
|||
|
name: '',
|
|||
|
region: '',
|
|||
|
type: ''
|
|||
|
}
|
|||
|
};
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
```
|
|||
|
:::
|
|||
|
|
|||
|
### Validation
|
|||
|
|
|||
|
Form component allows you to verify your data, helping you find and correct errors.
|
|||
|
|
|||
|
:::demo Just add the `rules` attribute for `Form` component, pass validation rules, and set `prop` attribute for `Form-Item` as a specific key that needs to be validated. See more information at [async-validator](https://github.com/yiminghe/async-validator).
|
|||
|
|
|||
|
```html
|
|||
|
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="120px" class="demo-ruleForm">
|
|||
|
<el-form-item label="Activity name" prop="name">
|
|||
|
<el-input v-model="ruleForm.name"></el-input>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity zone" prop="region">
|
|||
|
<el-select v-model="ruleForm.region" placeholder="Activity zone">
|
|||
|
<el-option label="Zone one" value="shanghai"></el-option>
|
|||
|
<el-option label="Zone two" value="beijing"></el-option>
|
|||
|
</el-select>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity time" required>
|
|||
|
<el-col :span="11">
|
|||
|
<el-form-item prop="date1">
|
|||
|
<el-date-picker type="date" placeholder="Pick a date" 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 type="fixed-time" placeholder="Pick a time" v-model="ruleForm.date2" style="width: 100%;"></el-time-picker>
|
|||
|
</el-form-item>
|
|||
|
</el-col>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Instant delivery" prop="delivery">
|
|||
|
<el-switch v-model="ruleForm.delivery"></el-switch>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity type" prop="type">
|
|||
|
<el-checkbox-group v-model="ruleForm.type">
|
|||
|
<el-checkbox label="Online activities" name="type"></el-checkbox>
|
|||
|
<el-checkbox label="Promotion activities" name="type"></el-checkbox>
|
|||
|
<el-checkbox label="Offline activities" name="type"></el-checkbox>
|
|||
|
<el-checkbox label="Simple brand exposure" name="type"></el-checkbox>
|
|||
|
</el-checkbox-group>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Resources" prop="resource">
|
|||
|
<el-radio-group v-model="ruleForm.resource">
|
|||
|
<el-radio label="Sponsorship"></el-radio>
|
|||
|
<el-radio label="Venue"></el-radio>
|
|||
|
</el-radio-group>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity form" 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')">Create</el-button>
|
|||
|
<el-button @click="resetForm('ruleForm')">Reset</el-button>
|
|||
|
</el-form-item>
|
|||
|
</el-form>
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
return {
|
|||
|
ruleForm: {
|
|||
|
name: '',
|
|||
|
region: '',
|
|||
|
date1: '',
|
|||
|
date2: '',
|
|||
|
delivery: false,
|
|||
|
type: [],
|
|||
|
resource: '',
|
|||
|
desc: ''
|
|||
|
},
|
|||
|
rules: {
|
|||
|
name: [
|
|||
|
{ required: true, message: 'Please input Activity name', trigger: 'blur' },
|
|||
|
{ min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' }
|
|||
|
],
|
|||
|
region: [
|
|||
|
{ required: true, message: 'Please select Activity zone', trigger: 'change' }
|
|||
|
],
|
|||
|
date1: [
|
|||
|
{ type: 'date', required: true, message: 'Please pick a date', trigger: 'change' }
|
|||
|
],
|
|||
|
date2: [
|
|||
|
{ type: 'date', required: true, message: 'Please pick a time', trigger: 'change' }
|
|||
|
],
|
|||
|
type: [
|
|||
|
{ type: 'array', required: true, message: 'Please select at least one activity type', trigger: 'change' }
|
|||
|
],
|
|||
|
resource: [
|
|||
|
{ required: true, message: 'Please select activity resource', trigger: 'change' }
|
|||
|
],
|
|||
|
desc: [
|
|||
|
{ required: true, message: 'Please input activity form', 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>
|
|||
|
```
|
|||
|
:::
|
|||
|
|
|||
|
### Custom validation rules
|
|||
|
|
|||
|
This example shows how to customize your own validation rules to finish a two-factor password verification.
|
|||
|
|
|||
|
:::demo Here we use `status-icon` to reflect validation result as an icon.
|
|||
|
```html
|
|||
|
<el-form :model="ruleForm2" status-icon :rules="rules2" ref="ruleForm2" label-width="120px" class="demo-ruleForm">
|
|||
|
<el-form-item label="Password" prop="pass">
|
|||
|
<el-input type="password" v-model="ruleForm2.pass" auto-complete="off"></el-input>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Confirm" prop="checkPass">
|
|||
|
<el-input type="password" v-model="ruleForm2.checkPass" auto-complete="off"></el-input>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Age" prop="age">
|
|||
|
<el-input v-model.number="ruleForm2.age"></el-input>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item>
|
|||
|
<el-button type="primary" @click="submitForm('ruleForm2')">Submit</el-button>
|
|||
|
<el-button @click="resetForm('ruleForm2')">Reset</el-button>
|
|||
|
</el-form-item>
|
|||
|
</el-form>
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
var checkAge = (rule, value, callback) => {
|
|||
|
if (!value) {
|
|||
|
return callback(new Error('Please input the age'));
|
|||
|
}
|
|||
|
setTimeout(() => {
|
|||
|
if (!Number.isInteger(value)) {
|
|||
|
callback(new Error('Please input digits'));
|
|||
|
} else {
|
|||
|
if (value < 18) {
|
|||
|
callback(new Error('Age must be greater than 18'));
|
|||
|
} else {
|
|||
|
callback();
|
|||
|
}
|
|||
|
}
|
|||
|
}, 1000);
|
|||
|
};
|
|||
|
var validatePass = (rule, value, callback) => {
|
|||
|
if (value === '') {
|
|||
|
callback(new Error('Please input the password'));
|
|||
|
} else {
|
|||
|
if (this.ruleForm2.checkPass !== '') {
|
|||
|
this.$refs.ruleForm2.validateField('checkPass');
|
|||
|
}
|
|||
|
callback();
|
|||
|
}
|
|||
|
};
|
|||
|
var validatePass2 = (rule, value, callback) => {
|
|||
|
if (value === '') {
|
|||
|
callback(new Error('Please input the password again'));
|
|||
|
} else if (value !== this.ruleForm2.pass) {
|
|||
|
callback(new Error('Two inputs don\'t match!'));
|
|||
|
} else {
|
|||
|
callback();
|
|||
|
}
|
|||
|
};
|
|||
|
return {
|
|||
|
ruleForm2: {
|
|||
|
pass: '',
|
|||
|
checkPass: '',
|
|||
|
age: ''
|
|||
|
},
|
|||
|
rules2: {
|
|||
|
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>
|
|||
|
```
|
|||
|
:::
|
|||
|
|
|||
|
### Delete or add form items dynamically
|
|||
|
|
|||
|
:::demo In addition to passing all validation rules at once on the form component, you can also pass the validation rules or delete rules on a single form field dynamically.
|
|||
|
|
|||
|
```html
|
|||
|
<el-form :model="dynamicValidateForm" ref="dynamicValidateForm" label-width="120px" class="demo-dynamic">
|
|||
|
<el-form-item
|
|||
|
prop="email"
|
|||
|
label="Email"
|
|||
|
:rules="[
|
|||
|
{ required: true, message: 'Please input email address', trigger: 'blur' },
|
|||
|
{ type: 'email', message: 'Please input correct email address', 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="'Domain' + index"
|
|||
|
:key="domain.key"
|
|||
|
:prop="'domains.' + index + '.value'"
|
|||
|
:rules="{
|
|||
|
required: true, message: 'domain can not be null', trigger: 'blur'
|
|||
|
}"
|
|||
|
>
|
|||
|
<el-input v-model="domain.value"></el-input><el-button @click.prevent="removeDomain(domain)">Delete</el-button>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item>
|
|||
|
<el-button type="primary" @click="submitForm('dynamicValidateForm')">Submit</el-button>
|
|||
|
<el-button @click="addDomain">New domain</el-button>
|
|||
|
<el-button @click="resetForm('dynamicValidateForm')">Reset</el-button>
|
|||
|
</el-form-item>
|
|||
|
</el-form>
|
|||
|
<script>
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
return {
|
|||
|
dynamicValidateForm: {
|
|||
|
domains: [{
|
|||
|
key: 1,
|
|||
|
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({
|
|||
|
key: Date.now(),
|
|||
|
value: ''
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
</script>
|
|||
|
```
|
|||
|
:::
|
|||
|
|
|||
|
### Number Validate
|
|||
|
|
|||
|
::: demo Number Validate need a `.number` modifier added on the input `v-model` binding,it's used to transform the string value to the number which is provided by Vuejs.
|
|||
|
```html
|
|||
|
<el-form :model="numberValidateForm" ref="numberValidateForm" label-width="100px" class="demo-ruleForm">
|
|||
|
<el-form-item
|
|||
|
label="age"
|
|||
|
prop="age"
|
|||
|
:rules="[
|
|||
|
{ required: true, message: 'age is required'},
|
|||
|
{ type: 'number', message: 'age must be a number'}
|
|||
|
]"
|
|||
|
>
|
|||
|
<el-input type="age" v-model.number="numberValidateForm.age" auto-complete="off"></el-input>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item>
|
|||
|
<el-button type="primary" @click="submitForm('numberValidateForm')">Submit</el-button>
|
|||
|
<el-button @click="resetForm('numberValidateForm')">Reset</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>
|
|||
|
```
|
|||
|
:::
|
|||
|
|
|||
|
:::tip
|
|||
|
When an `el-form-item` is nested in another `el-form-item`, its label width will be `0`. You can set `label-width` on that `el-form-item` if needed.
|
|||
|
:::
|
|||
|
|
|||
|
### Size control
|
|||
|
|
|||
|
All components in a Form inherit their `size` attribute from that Form. Similarly, FormItem also has a `size` attribute.
|
|||
|
|
|||
|
::: demo Still you can fine tune each component's `size` if you don't want that component to inherit its size from From or FormIten.
|
|||
|
```html
|
|||
|
<el-form ref="form" :model="sizeForm" label-width="120px" size="mini">
|
|||
|
<el-form-item label="Activity name">
|
|||
|
<el-input v-model="sizeForm.name"></el-input>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity zone">
|
|||
|
<el-select v-model="sizeForm.region" placeholder="please select your zone">
|
|||
|
<el-option label="Zone one" value="shanghai"></el-option>
|
|||
|
<el-option label="Zone two" value="beijing"></el-option>
|
|||
|
</el-select>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity time">
|
|||
|
<el-col :span="11">
|
|||
|
<el-date-picker type="date" placeholder="Pick a date" 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 type="fixed-time" placeholder="Pick a time" v-model="sizeForm.date2" style="width: 100%;"></el-time-picker>
|
|||
|
</el-col>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Activity type">
|
|||
|
<el-checkbox-group v-model="sizeForm.type">
|
|||
|
<el-checkbox-button label="Online activities" name="type"></el-checkbox-button>
|
|||
|
<el-checkbox-button label="Promotion activities" name="type"></el-checkbox-button>
|
|||
|
</el-checkbox-group>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item label="Resources">
|
|||
|
<el-radio-group v-model="sizeForm.resource" size="medium">
|
|||
|
<el-radio border label="Sponsor"></el-radio>
|
|||
|
<el-radio border label="Venue"></el-radio>
|
|||
|
</el-radio-group>
|
|||
|
</el-form-item>
|
|||
|
<el-form-item size="large">
|
|||
|
<el-button type="primary" @click="onSubmit">Create</el-button>
|
|||
|
<el-button>Cancel</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
|
|||
|
|
|||
|
| Attribute | Description | Type | Accepted Values | Default |
|
|||
|
| ---- | ----| ---- | ---- | ---- |
|
|||
|
| model| data of form component | object | — | — |
|
|||
|
| rules | validation rules of form | object | — | — |
|
|||
|
| inline | whether the form is inline | boolean | — | false |
|
|||
|
| label-position | position of label | string | left / right / top | right |
|
|||
|
| label-width | width of label, and all its direct child form items will inherit this value | string | — | — |
|
|||
|
| label-suffix | suffix of the label | string | — | — |
|
|||
|
| show-message | whether to show the error message | boolean | — | true |
|
|||
|
| inline-message | whether to display the error message inline with the form item | boolean | — | false |
|
|||
|
| status-icon | whether to display an icon indicating the validation result | boolean | — | false |
|
|||
|
| size | control the size of components in this form | string | medium / small / mini | - |
|
|||
|
|
|||
|
### Form Methods
|
|||
|
|
|||
|
| Method | Description | Parameters |
|
|||
|
| ---- | ---- | ---- |
|
|||
|
| validate | the method to validate the whole form. Returns a promise if callback is omitted | Function(callback: Function(boolean)) |
|
|||
|
| validateField | the method to validate a certain form item | Function(prop: string, callback: Function(errorMessage: string)) |
|
|||
|
| resetFields | reset all the fields and remove validation result | — |
|
|||
|
| clearValidate | clear validation message for all fields | -
|
|||
|
|
|||
|
### Form-Item Attributes
|
|||
|
|
|||
|
| Attribute | Description | Type | Accepted Values | Default |
|
|||
|
| ---- | ----| ---- | ---- | ---- |
|
|||
|
| prop | a key of `model`. In the use of validate and resetFields method, the attribute is required | string | keys of model that passed to `form` |
|
|||
|
| label | label | string | — | — |
|
|||
|
| label-width | width of label, e.g. '50px' | string | — | — |
|
|||
|
| required | whether the field is required or not, will be determined by validation rules if omitted | string | — | false |
|
|||
|
| rules | validation rules of form | object | — | — |
|
|||
|
| error | field error message, set its value and the field will validate error and show this message immediately | string | — | — |
|
|||
|
| show-message | whether to show the error message | boolean | — | true |
|
|||
|
| inline-message | inline style validate message | boolean | — | false |
|
|||
|
| size | control the size of components in this form-item | string | medium / small / mini | - |
|
|||
|
|
|||
|
### Form-Item Slot
|
|||
|
| Name | Description |
|
|||
|
|------|--------|
|
|||
|
| — | content of Form Item |
|
|||
|
| label | content of label |
|
|||
|
|
|||
|
### Form-Item Methods
|
|||
|
|
|||
|
| Method | Description | Parameters |
|
|||
|
| ---- | ---- | ---- |
|
|||
|
| resetField | reset current field and remove validation result | — |
|