小程序表单校验uni-forms的正确使用方式以及避坑指南

 更新时间:2022年08月02日 15:58:31   作者:iamlujingtao  
因微信小程序上没有自带表单验证,为了实现就自己做了个表单验证,下面这篇文章主要给大家介绍了关于小程序表单校验uni-forms的正确使用方式以及避坑指南,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

一、前言

小程序上使用表单理应是很常用,也很必须的功能,因为系统实用了uni-app,所以这时候会用到uni-forms,但使用过程中遇到不少问题。
这边的需求有3个:

即时校验(输入框失焦立即校验值)需自定义校验规则需要异步校验

满足这3个需求,就能实现绝大部分表单校验,然而直接使用官方的案例并不能满足,踩过不少坑,最后解决方案如下。

二、成果展示

以下展示均满足上述3个需求,下面示例代码可以直接看 第六点

三、uni-forms即时校验

实现即时校验,uni-forms需要加validate-trigger="bind",同时input添加@blur="binddata('字段名', $event.detail.value)"
示例:

 <uni-forms ref="form" :modelValue="ruleForm" validate-trigger="bind">
   <uni-forms-item label="账号" name="account">
     <input v-model.trim="ruleForm.account" 
     @blur="binddata('account', $event.detail.value)" 
     placeholder="请输入您的登录账号" />
   </uni-forms-item>
 </uni-forms>

四、uni-forms自定义校验规则

需要自定义校验规则时,去掉uni-forms的:rules,同时onReady里加this.$refs.form.setRules(this.rules),其中validateFunction: this.checkEmail为自定义校验方法

示例:

<template>
  <uni-forms ref="form" :modelValue="ruleForm" validate-trigger="bind">
    ......
  </uni-forms>
</template>

<script>
export default {
  data() {
    return {
      // 校验规则
      rules: {
        email: {
          rules: [
            {
              validateFunction: this.checkEmail,
            },
          ],
        },
      },
    };
  },
  onReady() {
    // 需要在onReady中设置规则
    this.$refs.form.setRules(this.rules);
  },
  methods: {
    /**
     * 表单验证邮箱
     */
    checkEmail(rule, value, allData, callback) {
      if (value !== "" && !verifyEmail(value)) {
        return callback("邮箱不正确");
      }
      callback();
    },
  },
};
</script>

五、uni-forms异步校验

通常使用异步方法来校验账号是否重复等,步骤:

  1. 首先需要自定义校验方法validateFunction: this.checkAccount
  2. 然后进行常规的规则校验
  3. 再进行异步方法校验账号唯一性
    需要使用Promise,校验通过使用 return resolve()
    校验失败使用 return reject(new Error('错误提示信息'))

示例(核心代码部分):

export default {
  data() {
    return {
      // 校验规则
      rules: {
        account: {
          rules: [
            {
              required: true,
              errorMessage: '请输入您的账号',
            },
            {
              validateFunction: this.checkAccount,
            },
          ],
        },
      },
    };
  },
  methods: {
    // 表单验证账号
    checkAccount(rule, value) {
      return new Promise((resolve, reject) => {
        // 先进行规则校验
        if (value === '' || !verifyAccount(value)) {
          return reject(new Error('只能输入4-30位英文、数字、下划线'))
        }

        // 再进行异步校验,checkUser为本系统api异步方法,结合你系统使用你自己的方法
        apiCheckAccount({ account: value })
          .then((data) => {
            if (data.exist) {
              return reject(new Error('账号已存在'))
            }
            resolve()
          })
          .catch((err) => {
            return reject(new Error(err.message))
          })
      })
    },
  },

六、完整示例源码

<template>
  <view class="register">
    <view class="title">最实用表单校验</view>
    <uni-forms ref="form" :modelValue="ruleForm" validate-trigger="bind" label-width="40">
      <uni-forms-item label="账号" name="account">
        <input v-model.trim="ruleForm.account" @blur="binddata('account', $event.detail.value)" placeholder="请输入您的登录账号" />
      </uni-forms-item>
      <uni-forms-item label="姓名" name="name">
        <input v-model.trim="ruleForm.name" @blur="binddata('name', $event.detail.value)" placeholder="请输入您的姓名" />
      </uni-forms-item>
      <uni-forms-item class="form-item-center">
        <button type="primary" @click="submit()">注册</button>
      </uni-forms-item>
    </uni-forms>
  </view>
</template>

<script>
import { apiCheckAccount } from '@/api'
import { verifyAccount, verifyName } from '@/utils'

export default {
  data() {
    return {
      // 表单数据
      ruleForm: {
        account: '', // 账号
        name: '', // 姓名
      },

      rules: {},
    }
  },
  onReady() {
    this.setRules()
    // 需要在onReady中设置规则
    this.$refs.form.setRules(this.rules)
  },
  methods: {
    // 提交表单
    submit() {
      this.$refs.form
        .validate()
        .then(() => {
          uni.showToast({
            title: '注册成功!',
            duration: 2000,
            icon: 'success',
          })
        })
        .catch((err) => {
          console.log('表单校验失败:', err)
        })
    },

    // 设置校验规则
    setRules() {
      this.rules = {
        account: {
          rules: [
            {
              required: true,
              errorMessage: '请输入您的账号',
            },
            {
              validateFunction: this.checkAccount,
            },
          ],
        },
        name: {
          rules: [
            {
              required: true,
              errorMessage: '请输入您的姓名',
            },
            {
              validateFunction: this.checkName,
            },
          ],
        },
      }
    },

    // 验证账号
    checkAccount(rule, value) {
      return new Promise((resolve, reject) => {
        // 先进行规则校验
        if (value === '' || !verifyAccount(value)) {
          return reject(new Error('只能输入4-30位英文、数字、下划线'))
        }

        // 再进行异步校验,checkUser为本系统api异步方法,结合你系统使用你自己的方法
        apiCheckAccount({ account: value })
          .then((data) => {
            if (data.exist) {
              return reject(new Error('账号已存在'))
            }
            resolve()
          })
          .catch((err) => {
            return reject(new Error(err.message))
          })
      })
    },

    // 验证姓名
    checkName(rule, value, allData, callback) {
      if (!verifyName(value)) {
        return callback('只能输入1-30位中英文和数字')
      }
      callback()
    },
  },
}
</script>

补充:记录一个uni-forms表单每输入一次就自动失去焦点的问题

局部代码:

我之前是在key里面放了个input变量进去了,这确实也是个低级错误,但是此类问题的原因应该大同小异,就是v-for底层map循环的时候,key值发生了变化,导致dom更新,出现这个问题,去掉不确定性的key值绑定就好了

所以,用key要谨慎啊!一不小心找bug就是半天过去了

最后

到此这篇关于小程序表单校验uni-forms正确使用方式以及避坑指南的文章就介绍到这了,更多相关小程序表单校验uni-forms内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript实现简单的tab选项卡切换

    JavaScript实现简单的tab选项卡切换

    这篇文章主要介绍了JavaScript实现简单的tab选项卡切换的相关资料,需要的朋友可以参考下
    2016-01-01
  • JavaScript中分号的一些细节

    JavaScript中分号的一些细节

    这篇文章主要给大家介绍了关于JavaScript中分号的一些细节,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • webpack5搭建一个简易的react脚手架项目实践

    webpack5搭建一个简易的react脚手架项目实践

    本文文章主要介绍了webpack5搭建一个简易的react脚手架项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • JS中console对象内部提供调试方法示例详解

    JS中console对象内部提供调试方法示例详解

    本文介绍了JavaScript中`console`对象提供的多种调试方法,包括`log`、`debug`、`dir`、`table`、`clear`、`group`、`groupEnd`、`time`和`timeEnd`,每种方法都有其特定的用途,感兴趣的朋友跟随小编一起看看吧
    2025-02-02
  • 微信小程序BindTap快速连续点击目标页面跳转多次问题处理

    微信小程序BindTap快速连续点击目标页面跳转多次问题处理

    这篇文章主要介绍了微信小程序BindTap快速连续点击目标页面跳转多次问题处理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • JS与jQuery判断文本框还剩多少字符可以输入的方法

    JS与jQuery判断文本框还剩多少字符可以输入的方法

    这篇文章主要介绍了JS与jQuery判断文本框还剩多少字符可以输入的方法,简单分析了js字符个数统计的方法,并给出了jQuery字符统计插件textlimit的相关使用方法示例,需要的朋友可以参考下
    2018-09-09
  • 在模板页面的js使用办法

    在模板页面的js使用办法

    在使用了母板页面的项目中 使用js获取其中的标签id 需要先加载到本地看看他在浏览时候的页面源代码然后确定他的id
    2010-04-04
  • JavaScript实现跨浏览器的添加及删除事件绑定函数实例

    JavaScript实现跨浏览器的添加及删除事件绑定函数实例

    这篇文章主要介绍了JavaScript实现跨浏览器的添加及删除事件绑定函数,采用纯javascript实现jquery的bind及unbind添加与删除事件绑定的技巧,具有很好的浏览器兼容性,需要的朋友可以参考下
    2015-08-08
  • JavaScript setTimeout与setTimeinterval使用案例详解

    JavaScript setTimeout与setTimeinterval使用案例详解

    这篇文章主要介绍了JavaScript setTimeout与setTimeinterval使用案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • js中用FileSaver.saveAs()方法监听保存进度及进度条等方法

    js中用FileSaver.saveAs()方法监听保存进度及进度条等方法

    在实际场景中进度条通常是用于展示异步操作的进度,这篇文章主要给大家介绍了关于js中用FileSaver.saveAs()方法监听保存进度及进度条等方法的相关资料,文中给出了详细的代码示例,需要的朋友可以参考下
    2023-12-12

最新评论