uniapp form表单validator函数校验

尝试了用uniapp的from以及uni-forms发现并不是特别好用,就在插件市场找了一个类似于element-ui的表单验证组件,用法基本上和element-ui一致,使用也比较方便

因为目前是用uni-app做小程序,小程序使用有几个限制,需要注意一下;
一、使用

      依赖于async-validator

    npm install async-validator --save

    npm下载依赖,插件市场导入插件即可直接使用

先上代码

HTML:
   

<evan-form :model="formData" ref="form">
        <text class="tips">電郵/手機號碼</text>
        <evan-form-item key="phone" prop="phone">
                <drop-down @onClick="dropDownChange" class="drop-down" :current="currentIndex" :list="areaCode"></drop-down>
                <input class="form-input" type="number" maxlength="11" placeholder-class="form-input-placeholder" v-model="formData.phone" placeholder="請輸入電郵/手機號碼" />
        </evan-form-item>
        <text class="tips tips-bottom" style="padding-top: 40rpx;padding-bottom: 0;">密碼</text>
        <evan-form-item key="phone" prop="passwords">
                <input class="form-input" type="password" placeholder-class="form-input-placeholder" v-model="formData.passwords" placeholder="請輸入密碼" />
        </evan-form-item>
        <view @click="goForgetPass" class="forget-password"><text>忘記密碼</text></view>
    </evan-form>
    <view class="submit-btn">
        <button @click="submit" class="btn login" size="mini" type="default">登錄</button>
        <view class="submit-or"><text>或</text></view>
        <button @click="goRegister" class="btn register" size="mini" type="default">註冊</button>
    </view>

js:

    data(){
        return{
            formData: {
                    phone: '',
                    passwords: ''
                },
            rules: {
                phone: [
                    {
                        required: true,
                        message: '請輸入電郵/手機號碼'
                    },
                    {
                        validator: this.isMobile
                    },
                    {
                        validator: (rule, value, callback) => {
                            // 注意这里如果用的是methods里的isMobilePhone将不生效
                            if (this.$utils.isMobilePhone(value)) {
                                    callback()
                            } else {
                                    callback(new Error('手机号格式不正确'))
                            }
                        }
                    },
                ],
                passwords: [
                    {
                        required: true,
                        message: '請輸入密碼'
                    }
                
            },
        }
    },
     
    mounted() {
        this.$refs.form.setRules(this.rules);
    },
    methods:{
     
        isMobile(rule, value, callback) {
            let phonePattern = /^\d{8}$/; //8位数正则
            let chPhonePattern = /^\d{11}$/; //11位数正则
            if (this.currentIndex !== 3) {
                if (phonePattern.test(value) === false) {
                    callback(new Error('請輸入8位正確的手機號碼'));
                } else {
                    callback();
                }
            } else if (this.currentIndex === 3) {
                if (chPhonePattern.test(value) === false) {
                    callback(new Error('請輸入11位正確的手機號碼'));
                } else {
                    callback();
                }
             else {
                callback();
            }
        },
        dropDownChange(index) {
            this.currentIndex = index;
        },
        submit(){
            this.$refs.form.validate(res=>{
                console.log(res)
            })
        }
    }

大概效果就是这个样子,在使用validator的时候,一定要注意,正则校验不管是true还是false,callback()一定要写上,不然不会往下执行,接下来的校验将失效;
二、特别注意点
1. 由于小程序等的限制,不能传递function(会变成一个空对象),如果使用到了自定义校验validator,rules不通过props的方式传递,而是通过调用实例方法的方式传递,并且调用方法需放在mounted生命周期中,不然在h5以及支付宝小程序等下会报错,如果没有使用到了自定义校验validator,则依然可以通过prop的方式传递(v2.1.0开始支持)

     

   mounted() {
            // 这里必须放在mounted中,不然h5,支付宝小程序等会找不到this.$refs.form
            this.$nextTick(() => {
                this.$refs.form.setRules(this.rules)
            })
        }

 2. 由于小程序等的限制,不能传递正则表达式,所以如果通过prop方式传递rules,并且使用到pattern正则校验的时候需要通过string方式传递,需要将两边的斜杠去除,并且内部的斜杠需要变成双斜杠,具体可以参考demo中的正则校验

     

       {
                pattern: '^1\\d{10}$',
                message: '手机号格式不正确'
            }

3. rules中在validator方法中调用当前methods下的方法会报错,可提前将方法注入,或者validator直接调用methods中的方法

     

        data(){
            return{
                rules:{
                    phone: [{
                        required: true,
                        message: '请输入手机号'
                    },
                    {
                        validator: (rule, value, callback) => {
                            // 注意这里如果用的是methods里的isMobilePhone将不生效
                            if (this.$utils.isMobilePhone(value)) {
                                callback()
                            } else {
                                callback(new Error('手机号格式不正确'))
                            }
                        }
                    }]
                }
            }
        }

        data(){
            return{
                rules:{
                    phone: [{
                        required: true,
                        message: '请输入手机号'
                    },
                    {
                        validator: this.isMobilePhone
                    }]
                }
            }
        },
        methods:{
            isMobilePhone(rule,value,callback){
                if (this.$utils.isMobilePhone(value)) {
                    callback()
                } else {
                    callback(new Error('手机号格式不正确'))
                }
            }
        }

4. 表单的内容需要初始化

     

   data(){
            return{
                info:{
                    name: '',
                    email: '',
                    desc: '',
                    phone: ''
                }
            }
        }

详细使用以及详细demo请前往uni-app插件市场,

插件地址:https://ext.dcloud.net.cn/plugin?id=1137

Demo地址:https://github.com/EvanMaFYH/evan-form
 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值