Skip to content

LeoHuiyi/leo-vue-validator

master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Code

Latest commit

 

Git stats

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
 
 
 
 

leo-vue-validator

###一个异步的表单验证组件: 只变动数据,能适配各种UI

###update:添加删除不使用removeField 报错提示;验证方式:all 全部验证,first:只验证到第一个错误项, 添加resetCb回调, 表单验证时点击reset中断信息,添加errorCb回调, 表单验证时error中断信息

demo在线链接

demo下载地址

##例子

<template>
    <div id="app">
        <h1>
            leo-vue-validator例子
        </h1>
        <h3>
            注意事项:必须先点击初始化按钮或者调用(initForm接口)才能验证
        </h3>
        <h3>
            状态参数(state): 0: 没有验证过, 1: 通过, 2: 不通过, 3: 验证中
        </h3>
        <h3>
            自定义回调:
            1.必须要设置item.state = 1才能验证下面的事项
            2.必须调用回调参数cb()验证才开始
        </h3>
        <h3>
            改变forms中value的值 都会进行验证
        </h3>
        <leo-validator ref="leoForm" :forms="form1" tag="div" :tagOptions="tagOptions1">
            <h1>表单1(动态添加表单)</h1>
            <ul class="MoUpFlo_Module MoUpFlo_enterInfo">
                <li class="clearfix" v-for="(item, index) in form1">
                    <label>
                        <span>item{{index}}: </span>
                        <input class="infoVal" type="text" v-model="item.value"/>
                    </label>
                    <div>
                        <button @click="deleteItem(item)">删除</button>
                        <button @click="deleteItem1(item)">删除(不使用removeField 报错,初始化后))</button>
                    </div>
                    <p>状态:{{item.state}}&nbsp;&nbsp;&nbsp;&nbsp;提示:{{item.msg}}</p>
                </li>
            </ul>
            <button @click="initForm">初始化</button>
            <button @click="add">添加</button>
            <button @click="reset">重置</button>
            <div>
                <button @click="submit('all')">提交(全部验证)</button>
                <button @click="submit('first')">提交(验证到第一个错误项)</button>
            </div>
        </leo-validator>
        <leo-validator ref="leoForm1" :forms="form2" tag="div" :tagOptions="tagOptions2">
            <h1>表单2</h1>
            <ul>
                <li class="clearfix">
                    <label>
                        <span>没有验证 : </span>
                        <input class="infoVal" type="text" v-model="form2[1]['value']"/>
                    </label>
                    <p>状态:{{form2[1]['state']}}&nbsp;&nbsp;&nbsp;&nbsp;提示:{{form2[1]['msg']}}</p>
                </li>
                <li class="clearfix">
                    <label>
                        <span>手机号 : </span>
                        <input class="infoVal" type="text" v-model="form2[0]['value']"/>
                    </label>
                    <p>状态:{{form2[0]['state']}}&nbsp;&nbsp;&nbsp;&nbsp;提示:{{form2[0]['msg']}}</p>
                </li>
                <li class="clearfix">
                    <label>
                        <span>异步验证整组验证 : </span>
                        <p>(obj形式 失去焦点验证 password: 123456)</p>
                        <input class="infoVal" placeholder="user" type="text" v-model.lazy="form2[2]['value']['user']"
                               :disabled="form2[2]['state'] == 3"/>
                        <input class="infoVal" placeholder="password" type="text" v-model.lazy="form2[2]['value']['password']"
                               :disabled="form2[2]['state'] == 3"/>
                    </label>
                    <p>状态:{{form2[2]['state']}}&nbsp;&nbsp;&nbsp;&nbsp;提示:{{form2[2]['msg']}}</p>
                </li>
                <li class="clearfix">
                    <label>
                        <span>异步验证整组验证(array形式 失去焦点验证) : </span>
                        <input class="infoVal" type="text" v-model.lazy="form2[3].value[0]" :disabled="form2[3]['state'] == 3"/>
                        <input class="infoVal" type="text" v-model.lazy="form2[3].value[1]" :disabled="form2[3]['state'] == 3"/>
                    </label>
                    <p>状态:{{form2[3]['state']}}&nbsp;&nbsp;&nbsp;&nbsp;提示:{{form2[3]['msg']}}</p>
                </li>
            </ul>
            <button @click="initForm1">初始化</button>
            <button @click="reset1">重置</button>
            <div>
                <button @click="submit1('all')">提交(全部验证)</button>
                <button @click="submit1('first')">提交(验证到第一个错误项)</button>
            </div>
        </leo-validator>
    </div>
</template>

<script>
    import validator from './components/validator/validator'
    function leoAlert(data) {
        setTimeout(() => {
            alert(JSON.stringify(data, null, 4))
        })
    }

    export default {
        name: 'app',
        components: {
            'leo-validator': validator,
        },
        data(){
            return {
                form1: [
                    {
                        key: 'formKey1',
                        value: '',
                        rules: [
                            {
                                rule: 'required', tip: '请输入活动名称',
                            },
                            {
                                rule: 'isCode', tip: '邮政编码不正确(leo)'
                            }
                        ],
                        state: 0,
                        msg: '',
                    },
                    {
                        key: 'formKey2',
                        value: 'wahahha',
                        rules(value, rule, item, cb){
                            item.msg = 'loading'
                            setTimeout(() => {
                                cb((newVal, rule, item) => {
                                    item.state = 1//1才能成功
                                    item.msg = '成功'
                                })
                            }, 1000)
                        },
                        state: 0,
                        msg: '',
                    }
                ],
                form2: [
                    {
                        key: 'form2Item1',
                        value: '',
                        rules: [
                            {
                                rule: 'required', tip: '不能为空',
                            },
                            {
                                rule: 'isPhone', tip: '手机号码格式不对'
                            },
                        ],
                        state: 0,
                        msg: '',
                    },
                    {
                        key: 'form2Item2',
                        value: '',
                        state: 0,
                        msg: '',
                    },
                    {
                        key: 'form2Item3',
                        value: {
                            user: 'leo',
                            password: ''
                        },
                        rules: [
                            {
                                rule(value, rule, item, cb, index) {
                                    if(value.user === '') {
                                        item.msg = 'user不能为空'
                                        item.state = 2
                                        cb()
                                        return
                                    }
                                    item.msg = 'user验证中'
                                    setTimeout(() => {
                                        cb((newVal, rule, item) => {
                                            if(newVal.user.length > 6) {
                                                item.state = 2
                                                item.msg = 'user不正确'
                                            }else {
                                                item.state = 1
                                                item.msg = 'user验证成功'
                                            }
                                        })
                                    }, 1000)
//                                    throw new Error('error')
                                },
                            },
                            {
                                rule(value, rule, item, cb, index) {
                                    item.msg = 'password验证中'
                                    setTimeout(() => {
                                        cb((newVal, rule, item) => {
                                            if(newVal.password == 123456) {
                                                item.state = 1
                                                item.msg = 'password验证成功'
                                            }else {
                                                item.state = 2
                                                item.msg = 'password不正确'
                                            }
                                        })
                                    }, 1000)
                                },
                            },
                        ],
                        errorCb(e, item, i){
                            leoAlert(e.name)
                            console.log(e, item, i)
                        },
                        state: 0,
                        msg: '',
                        deep: true//对象的必须深度监听
                    },
                    {
                        key: 'form2Item4',
                        value: ['leo', 'leoWa'],
                        rules: [
                            {
                                rule(value, rule, item, cb, index) {
                                    if(value[0] === '' || value[1] === '') {
                                        item.msg = 'input都不能为空'
                                        item.state = 2
                                        cb()
                                        return
                                    }
                                    item.state = 3
                                    item.msg = '验证中'
                                    item.timerId = setTimeout(() => {
                                        item.timerId = null
                                        cb((newVal, rule, item) => {
                                            if(newVal[0] == newVal[1]) {
                                                item.state = 1
                                                item.msg = ''
                                            }else {
                                                item.state = 2
                                                item.msg = '第一项和第二项不相等'
                                            }
                                        })
                                    }, 300)
                                }
                            },
                        ],
                        resetCb(item, i){
                            if(item.timerId){  //clearTimeout
                                clearTimeout(item.timerId)
                                item.timerId = null
                            }
                        },
                        state: 0,
                        msg: ''
                    },
                ],
                tagOptions1: {
                    'class': 'form1',
                    'style': {paddingLeft: '10px'}
                },
                tagOptions2: {
                    'class': {form2: true},
                    'style': {paddingLeft: '10px'}
                }
            }
        },
        methods: {
            initForm1(){
                this.$refs.leoForm1.initForm()
            },
            initForm(){
                this.$refs.leoForm.initForm()
            },
            reset1(){
                this.$refs.leoForm1.resetFields()
            },
            submit1(op){
                this.$refs.leoForm1.validate(op).then((result) => {
                    leoAlert(result)
                }).catch((result) => {
                    console.log('catch')
                    leoAlert(result)
                })
                console.log(this.$refs.leoForm1.getFormData())
            },
            reset(){
                this.$refs.leoForm.resetFields()
            },
            submit(op){
                this.$refs.leoForm.validate(op).then((result) => {
                    leoAlert(result)
                }).catch((result) => {
                    console.log('catch')
                    leoAlert(result)
                })
                console.log(this.$refs.leoForm.getFormData())
            },
            add(){
                this.form1.push({
                    key: `formKey${this.form1.length + 1}`,
                    value: '',
                    rules: [
                        {
                            rule: (value, rule, item, cb) => {
                                if('leo好帅' === value) {
                                    item.state = 1
                                    item.msg = ''
                                }else {
                                    item.state = 2
                                    item.msg = '请输入leo好帅'
                                }
                                cb()
                            }
                        }
                    ],
                    state: 0,
                    msg: '',
                })
            },
            deleteItem(item){
                this.$refs.leoForm.removeField(item)
            },
            deleteItem1(item){
                const forms = this.form1
                const index = forms.indexOf(item)
                if(index > -1) {
                    forms.splice(index, 1)
                }
            }
        }
    }
</script>

options

Property	|	Type		|	Default		|	Description

:-----------------------|:--------------|:--------------|:-------------------------------- forms | Array | [] | 表单验证数据选项 form.key | String | '' | key(必须唯一) form.value | String | '' | value form.rules | Array or Object | '' | rules form.state | String | '' | 0: 没有验证过, 1: 通过, 2: 不通过, 3: 验证中 form.msg | String | '' | 提示信息 form.tip | String | '' | 替代默认规则的提示信息 form.deep | Boolean | '' | 深度watch form.resetCb | Function | '' | reset回调 form.errorCb | Function | '' | errorCb回调 tag | String | 'span' | leo-validator tag tagOptions | Object | 无 | leo-validator tagOptions

Method

============

在$refs上调用(具体看例子) 添加可以直接在forms数组上添加(要按vue的数组方法)! 删除只能调用removeField接口!

Name	|		Description

:-----------------------|:--------------| initForm | 初始化(必须首次验证前调用 才能开始验证) resetFields | 重置 validate | 验证(是个Promise,具体可以看例子, 参数:all 全部验证,first:只验证到第一个错误项) removeField | 删除(删除item 可以传入数组) getFormData | 取得FormData

License

MIT Licensed. Copyright (c) leoHuiyi 2016.

About

一个基于vue2异步的表单验证组件

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published