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

news2024/11/19 22:51:19

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

  • 一、前言
  • 二、成果展示
  • 三、uni-forms即时校验
  • 四、uni-forms自定义校验规则
  • 五、uni-forms异步校验
  • 六、完整示例源码
  • 七、最后,点个赞

一、前言

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

  1. 即时校验(输入框失焦立即校验值)
  2. 需自定义校验规则
  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>

七、最后,点个赞

如果帮到你,点个赞再走嘛 :)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409080.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【微信小程序】自定义组件

组件的创建与引用 1.1、创建组件 &#xff08;1&#xff09;在项目的根目录中&#xff0c;鼠标右键&#xff0c;创建 components > test 文件夹 &#xff08;2&#xff09;在新建的 components > test 文件夹中&#xff0c;鼠标右键&#xff0c;点击“新建 Component” …

通过JavaScript、css、H5 实现简单的tab栏的切换和复用

目录 一、效果展示 二、实现的大致原理 三、H5的布局 四、CSS样式 五、JS代码内容 六、完整代码 一、效果展示 二、实现的大致原理 1.我们先通过css 和h5布局得到最基本的tab栏样式&#xff08;有代码参考&#xff09; 2.在获得样式&#xff0c;给我们所需要点击的目标设…

yolov5部署+微信小程序前端展示

分为yolov5项目部署和微信小程序两部分&#xff0c;先介绍微信小程序前端展示flask后端&#xff0c;之后介绍项目部署这部分。 一、先上效果图 1. 点击选择图片&#xff0c;调用摄像头选择图片 2.选择图片之后&#xff0c;点击开始检测&#xff0c;然后返回结果 ​​​​​​…

CTF----Web真零基础入门

目录 前置知识导图&#xff1a; ​TCP/IP体系结构&#xff08;IP和端口&#xff09;&#xff1a; IP是什么&#xff1a;是计算机在互联网上的唯一标识&#xff08;坐标&#xff0c;代号&#xff09;&#xff0c;用于在互联网中寻找计算机。 内网&#xff08;局域网&#xf…

JSONP解决跨域问题

一、什么是同源 概念&#xff1a;如果两个页面的协议、域名和端口都相同&#xff0c;则这两个页面具有相同的源。 二、什么是同源策略 概念&#xff1a;是浏览器提供的一个安全功能。 三、什么是跨域 概念&#xff1a;同源指的是两个URL的协议、域名、端口号一致&#xff0c…

前端开发调式必备技能F12开发者工具之Elements(元素)面板,详细图解带流程【第一部分】

目录 一、进入浏览器开发工具的几种方式 二、Elements&#xff08;元素&#xff09;面板 左侧区域 右侧区域 计算样式 事件监听器 大家好&#xff01;我是爷爷的茶七里香&#xff0c;这个名字有没有让你想起周董的歌捏&#xff1f;好了&#xff0c;废话不多说&#xff0c;开始今…

项目实训记录(十二)——el-table-column根据条件修改字体颜色

目录 一、干了什么&#xff1f; 二、问题和解决方法 1. el-table-column根据条件修改字体颜色 2.问题 总结 一、干了什么&#xff1f; 本周要完成数据去重工作和前端的完善。 清理工作 主要是来删除用户插入的重复数据。由管理员决定表是否允许重复数据。如果用户上传的表不允…

vue3 自定义全局loading组件 (PC和移动端都非常适用)

前言 在开发的过程中&#xff0c;点击提交按钮&#xff0c;或者是一些其它场景总会遇到loading加载框&#xff0c;PC的一些ui库也没有这样的加载框&#xff0c;无法满足业务需求&#xff0c;因此可以自己自定义一个&#xff0c;实现过程如下。 效果图&#xff08;loading样式…

个人博客小程序

文章目录1.前言2.首页博客数据展示3.用data中的数据渲染博客展示4.使用云数据库创建集合blogs5.读取数据库中的数据6.创建添加博客页面1.前言 这篇文章详细的介绍了个人博客小程序的云开发流程&#xff0c;包括博客展示页面&#xff0c;添加博客页面的创建&#xff0c;以及云函…

pm2基本使用

1.pm2的基本介绍 pm2是node的进程管理器&#xff0c;利用它可以简化node任务的管理,且内置了许多功能,常用于后台脚本管理。 pm2特性 自带热部署 - - - 当源文件更新 线上项目也会自动重启后台运行 - - - 不会占用实时窗口 会在后台运行服务信息查看 - - - 查看运行中程序的…

Vue权限控制

此文章根据视频教程进行整理前端面试官必问系列-后台系统的权限控制与管理&#xff0c;建议搭配视频教程一起食用效果更佳 目录 1、权限相关概念 1.1、权限的分类 后端权限 前端权限 1.2 、前端权限的意义 降低非法操作的可能性 尽量减少不必要请求&#xff0c;减轻服务…

VUE跨域、常用解决跨域的方法

当我们遇到请求后台接口遇到 Access-Control-Allow-Origin 时&#xff0c;那说明跨域了。 跨域是因为浏览器的同源策略所导致&#xff0c;同源策略&#xff08;Same origin policy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能&#xff0c;同源是指&…

〖大前端 - 基础入门三大核心之CSS篇⑱〗- CSS中的背景

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费开放&#xff0c;购买任意白宝书体系化专栏可加入TFS-CLUB 私域社区。福利&#xff1a;除了通过订阅"白宝书系列专栏"加入社区获取所有付费专栏的内容之外&#xff0c;还可以通过加入星荐…

【React Router v6】路由组件传参params/search/state(router v6)

欢迎来到我的博客 📔博主是一名大学在读本科生,主要学习方向是前端。 🍭目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 🛠目前正在学习的是🔥 R e a c t 框架 React框架 Reac

react-router v6 如何实现动态路由?

前言 最近在肝一个后台管理项目&#xff0c;用的是react18 ts 路由用的是v6&#xff0c;当需要实现根据权限动态加载路由表时&#xff0c;遇到了不少问题。 v6相比于v5做了一系列改动&#xff0c;通过路由表进行映射就是一个很好的改变&#xff08;个人认为&#xff09;&…

Docker利用Nginx部署前端项目

今天给大家分享的是Docker利用Nginx部署Vue等前端页面项目&#xff1b;其实是我工作刚好用到&#xff0c;顺便分享给大家O(∩_∩)O&#xff0c;那么话不多说直接开始。 一&#xff1a;准备文件 我们先将前端项目打包好&#xff0c;放到此文件夹下&#xff0c;例如我这样&#…

ts基本类型 typeof 和keyof

安装编译ts的工具 安装命令&#xff1a;npm i -g typescript 或者 yarn global add typescript。 验证是否安装成功&#xff1a;tsc –v&#xff08;查看 TypeScript 的版本&#xff09;。 编译并运行 TS 代码 创建 hello.ts 文件&#xff08;注意&#xff1a;TS 文件的后缀名…

vue3中ref和reactive的区别

ref 接受一个内部值并返回一个响应式且可变的 ref 对象&#xff0c;有一个 .value 属性&#xff0c;可以通过其读取/修改对象的值。 const active ref(false)console.log(active.value) // falseactive.value trueconsole.log(active.value) // true 为ref值指定泛型参数覆盖…

Vue中的$set

项目场景&#xff1a; 例如&#xff1a;在我写前端项目的时候&#xff0c;后端给我们的一个json对象&#xff0c;并且我已经渲染在页面上了。但是由于我自己的需求&#xff0c;想往返回的对象里面添加一个字段&#xff0c;后来才意识到不是响应式的。如果我们要让这个新字段是…

【博主推荐】html好看的个人主页(附源码)

个人主页介绍【博主推荐】html好看的个人主页1.背景个人主页效果2.背景个人主页代码3.简洁个人主页效果4.简洁个人主页代码5.卡片个人主页效果6.卡片个人主页代码7.星空个人主页效果8.星空个人主页代码源码下载【博主推荐】html好看的个人主页 附带四种风格个人主页 背景个人主…