uniapp form表单validator函数校验

简介: 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)
        })
    }
}

20210527153548522.png

大概效果就是这个样子,在使用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

相关文章
|
7月前
uniapp的form表单自定义验证规则
uniapp的form表单自定义验证规则
285 0
|
7月前
|
JavaScript API
uniapp使用Vue3挂载函数到全局
uniapp使用Vue3挂载函数到全局
939 0
|
7月前
uniapp进行表单效验
uniapp进行表单效验
370 0
|
JSON 小程序 算法
uniapp小程序封装常用工具函数
类似的工具函数还有很多,这里暂时不一一列举了,上面提到的银行卡校验,还可以使用阿里公开的一个校验接口cardNo=银行卡号码&cardBinCheck=true这个接口会返回对应的银行简称银行卡类型,如果想要显示对应的银行logo的话,可以联系我,由于JSON数据太大,没办法全部放在这里。
205 0
|
7月前
|
Web App开发 小程序 Android开发
Uniapp from 表单组件 多层选择 开关 评分 滑块 步进器 日期框 级联选择 下拉列表 复选框 单选框 多行文本 单行文本 textarea radio checkbox picker
Uniapp from 表单组件 多层选择 开关 评分 滑块 步进器 日期框 级联选择 下拉列表 复选框 单选框 多行文本 单行文本 textarea radio checkbox picker
108 0
|
2月前
|
供应链 JavaScript 数据管理
uniapp/vue如何实现一个子表单及子表单作用
uniapp/vue如何实现一个子表单及子表单作用
39 5
|
5月前
|
存储
uniapp实战 -- 个人信息维护(含选择图片 uni.chooseMedia,上传文件 uni.uploadFile,获取和更新表单数据)
uniapp实战 -- 个人信息维护(含选择图片 uni.chooseMedia,上传文件 uni.uploadFile,获取和更新表单数据)
180 2
|
7月前
|
JavaScript 小程序 API
uniapp中的uview组件库丰富的Form 表单用法
uniapp中的uview组件库丰富的Form 表单用法
907 0
|
7月前
|
JavaScript
uniapp使用uv-vi组件创建表单,收集信息
uniapp使用uv-vi组件创建表单,收集信息
114 0
uniapp提交表单填写
uniapp提交表单填写的内容
106 0