kui-vue
Version:
A high quality UI Toolkit built on Vue.js 2.0
271 lines (267 loc) • 8.23 kB
Markdown
<cn>
#### 表单验证
在防止用户犯错的前提下,尽可能让用户更早地发现并纠正错误。
</cn>
```vue
<template>
<div style="width:600px;">
<Form :model="form" :size="size" :rules="rules" ref="form" :labelCol="labelCol" :wrapperCol="wrapperCol">
<FormItem label="Size">
<RadioGroup v-model="size" >
<RadioButton value="large" label="Large" />
<RadioButton value="default" label="Default" />
<RadioButton value="small" label="Small" />
</RadioGroup>
</FormItem>
<FormItem label="E-mail" prop="email">
<Input clearable />
</FormItem>
<FormItem label="Number" prop="number">
<InputNumber />
</FormItem>
<FormItem label="Password" prop="password">
<Input type="password" />
</FormItem>
<FormItem label="Confirm Password" prop="repassword">
<Input type="password" />
</FormItem>
<FormItem label="Phone Number" prop="phone">
<Input />
</FormItem>
<FormItem label="Captcha" prop="captcha">
<Input>
<Button slot="suffix" :size="size" :disabled="time!=60" style="width:100px;" @click="sendCode">{{time==60?'获取验证码':time+'(s)'}}</Button>
</Input>
</FormItem>
<FormItem label="Country">
<FormItem prop="country">
<Select clearable style="width:100%">
<Option value="0" label="China" />
<Option value="1" label="Russia" />
</Select>
</FormItem>
<FormItem prop="city">
<Select clearable style="width:100%">
<Option value="0" label="Shanghai" />
<Option value="1" label="Wuhan" />
<Option value="2" label="Hangzhou" />
</Select>
</FormItem>
</FormItem>
<FormItem label="TreeSelect" prop="tree">
<TreeSelect style="width:100%;" :tree-data="treeData">
</TreeSelect>
</FormItem>
<FormItem label="Slider" prop="slider">
<Slider />
</FormItem>
<FormItem label="Gender" prop="gender">
<RadioGroup >
<Radio value="0" label="Girl" />
<Radio value="1" label="Boy" />
</RadioGroup>
</FormItem>
<FormItem label="One" prop="one">
<Radio label="Only One?" />
</FormItem>
<FormItem label="System" prop="system">
<RadioGroup >
<RadioButton value="0" label="Mac OS" />
<RadioButton value="1" label="Windows" />
<RadioButton value="2" label="Linux" />
</RadioGroup>
</FormItem>
<FormItem label="Birthday" prop="birthday">
<DatePicker clearable />
</FormItem>
<FormItem label="Hobby" prop="hobby">
<CheckboxGroup >
<Checkbox value="0" label="Football" />
<Checkbox value="1" label="Music" />
<Checkbox value="2" label="Photograph" />
<Checkbox value="3" label="Tennis" />
</CheckboxGroup>
</FormItem>
<FormItem label="Hardcore" prop="hardcore">
<Switch true-text="Yes" false-text="No" />
</FormItem>
<FormItem label="Other" prop="other">
<TextArea placeholder="最多只能输入10个字符" v-model="form.other" />
</FormItem>
<FormItem prop="readme" :wrapperCol="{offset:6}">
<Checkbox>我已阅读 <a>服务条款</a> </Checkbox>
</FormItem>
<FormItem :wrapperCol="{offset:6}">
<Button type="primary" @click="submit" >Submit</Button>
<Button style="margin:0 10px" @click="reset" >Reset</Button>
<Button type="dashed" @click="setValue" >Set Value</Button>
</FormItem>
</Form>
</div>
</template>
<script>
export default {
data() {
var validatePass = (rule, value, callback) => {
if (value !== this.form.password) {
return callback(new Error('两次密码不一致'))
}
callback()
};
var validateReadme = (rule, value, callback) => {
if (value !== true) {
return callback(new Error('请阅读服务条款'))
}
callback()
};
return {
labelCol:{span:6},
wrapperCol:{span:16},
time: 60,
size:'default',
treeData: [
{
title:'food',
key:'0',
children :[
{ title:'apple' ,key:'0-1' },
{ title:'orange' ,key:'0-2' },
]}
],
form: {
email: '',
number:'',
password: '',
repassword: '',
phone: '',
captcha: '',
slider:5,
tree:'',
gender: '',
one: false,
system:'',
birthday: '',
country: '',
city: '',
hobby: [],
hardcore: '',
other: '',
readme: false
},
rules: {
email: [
{ type: 'mail', message: '请输入有效的电子邮箱' },
{ required: true, message: '请输入电子邮箱' },
],
number:[
{ type: 'number', message: '请输入有效的请输入数字' },
{ required: true, message: '请输入数字' },
],
password: [
{ min: 8, max: 20, message: '密码长度请控制在8-20位之间', trigger: 'blur' },
{ required: true, message: '请输入密码' },
],
repassword: [
{ min: 8, max: 20, message: '密码长度请控制在8-20位之间', trigger: 'blur' },
{ validator: validatePass },
{ required: true, message: '请重复输入密码' },
],
phone: [
{ type: 'mobile', message: '请输入正确的手机号码' },
{ required: true, message: '请输入手机号' },
],
birthday: [
{ required: true, message: '请选择出生日期' },
],
country: [
{ required: true, message: '请选择国家' },
],
tree: [
{ required: true, message: '请选择Food' },
],
city: [
{ required: true, message: '请选择城市' },
],
captcha: [
{ type: 'number', message: '验证码为数字' },
{ required: true, message: '请输入验证码' },
],
slider: [
{ min: 3, message: '最小值为3' },
{ max: 50, message: '最大值为50' },
],
gender: [
{ required: true, message: '请选择性别' },
],
one: [
{ required: true, message: '霸王选项' },
],
system: [
{ required: true, message: '请选择系统类型' },
],
hardcore: [
{ required: true, message: '霸王选项' },
],
readme: [
{ validator: validateReadme },
],
hobby: [
{ required: true, message: '请选择爱好' },
{ max: 3, message: '最多只能选择3个爱好' },
{ min: 2, message: '最少选择2个爱好' },
],
other: [
{ required: true, message: '请填写其他信息' },
{ max: 10, message: '最多只能输入10个字符' },
]
}
}
},
methods: {
setValue() {
this.form = {
email: 'master@k-ui.cn',
password: 'abc@123@123',
repassword: 'abc@123@123',
phone: '13888888888',
captcha: '8888',
gender: '1',
slider:5,
number:5,
tree:'0',
system: '0',
one: true,
birthday: '1995-05-05',
country: '1',
city: '1',
hobby: ['0', '1'],
hardcore: true,
other: '测试数据',
readme: true
}
},
sendCode() {
this.time = 59
this.$Message.success("验证码发送成功,请注意查收");
clearInterval(this.timer)
this.timer = setInterval(e => {
if (this.time < 1) {
clearInterval(this.timer)
this.time = 60
} else {
this.time--
}
}, 1000)
},
submit() {
this.$refs.form.validate(valid => {
this.$Message[valid ? 'success' : 'error'](valid ? 'success' : 'faild')
})
},
reset() {
this.$refs.form.reset()
}
}
}
</script>
```