【Vue3 + ElementUI】表单校验无效(写法:this.$refs[‘formName‘].validate((valid) =>{} ))

一. 表单校验

1.1 template模块

el-form 中 若校验,ref 和 rules 必须要有

<template>
	<div style="padding:20px">
		<el-form ref="formName" :model="form" :rules="formRules"  label-width="120px">
			<template v-if="type == '查看'">
				<el-form-item>
          			<el-col :span="12">
           				<el-form-item label="联系人" prop="contactName">
              				<span>{{ form.contactName }}</span>
            			</el-form-item>
          			</el-col>
          			<el-col :span="12">
            			<el-form-item label="学历" prop="education">
              				<span>{{ form.education}}</span>
            			</el-form-item>
          			</el-col>
        		</el-form-item>
        		<el-form-item>
          			<el-col :span="12">
            			<el-form-item label="手机号" prop="phone">
              				<span>{{ form.phone }}</span>
            			</el-form-item>
          			</el-col>
          			<el-col :span="12">
            			<el-form-item label="邮箱" prop="email">
              				<span>{{ form.email }}</span>
            			</el-form-item>
          			</el-col>
        		</el-form-item>
			<template>
			<template v-else>
				<el-form-item>
          			<el-col :span="12">
            			<el-form-item label="联系人" prop="contactName">
              				<el-input v-model="form.contactName" placeholder="请输入联系人" maxlength="20" show-word-limit />
            			</el-form-item>
          			</el-col>
          			<el-col :span="12">
            			<el-form-item label="学历" prop="education">
              				<el-input v-model="form.education" placeholder="请输入学历" maxlength="20" show-word-limit />
            			</el-form-item>
          			</el-col>
        		</el-form-item>
        		<el-form-item>
          			<el-col :span="12">
            			<el-form-item label="手机号" prop="phonenumber">
              				<el-input v-model="form.phonenumber" placeholder="请输入手机号" maxlength="11" show-word-limit />
            			</el-form-item>
          			</el-col>
          			<el-col :span="12">
            			<el-form-item label="邮箱" prop="email">
              				<el-input v-model="form.email" placeholder="请输入邮箱" maxlength="20" show-word-limit />
            			</el-form-item>
          			</el-col>
        		</el-form-item>
			<template>
		</el-form>
		<div v-if="type == '修改'">
      		<el-button @click="handleClick">取 消</el-button>
      		<el-button type="primary" @click="handleSubmit">确 认</el-button>
    	</div>
	</div>
</template>

1.2 script 模块

<script setup name="Detail">
import { validPhoneNumber, validEmail } from '@/utils/validate'
import { update } from "@/api/xxx"

const { proxy } = getCurrentInstance()
const router = useRouter() // 用于进行路由的导航操作(跳转等)
const route = useRoute() // 获取当前路由的信息
const detailId = route.params.id // 该条数据的唯一主键 id,用于传参
const type = ref('') //  编辑 or 查看

// 监听路由并赋值给type字段(type的值为:查看/修改)
watch(
  () => route.query.type,
  newValue => {
    type.value = newValue
},
  {deep: true, immediate: true}
)

// 定义
const data = reactive({
  form: {},
  rules: {
    contactName: [
    	{ required: true, message: '名称必填', trigger: 'blur' }
    ],
    phonenumber: [
      {
        message: '请输入正确的手机号',
        trigger: 'blur',
        validator(rule, value, callback) {
          if (value && value !== '') {
            if (validPhoneNumber(value)) {
              return true
            } else {
              return false
            }
          } else {
            callback() // 必须返回,不然校验时获取不到vaild的值
          }
        }
      }
    ],
    email: [
      {
        message: '请输入正确的邮箱',
        trigger: 'blur',
        validator(rule, value, callback) {
          if (value !== '' && value !== null) {
            if (validEmail(value)) {
              return true
            } else {
              return false
            }
          } else {
            callback() // 必须返回,不然校验时获取不到vaild的值
          }
        }
      }
    ]
  }
})

// 重置表单
const reset = () => {
  form.value = {
    contactName: '',
    education: '',
    phonenumber: '',
    email: ''
  }
  proxy.resetForm('formName')
}
const { form, rules } = toRefs(data)

/**
 * 点击确认
 */
const submitForm = () => {
  // 详细查看 1.2.1 
}

/**
 * 点击取消:跳转到XXX页(此时会新打开一个标签页。解决办法:router.go(-1))
 */
const handleClick = async () => {
  await router.push({ path: `/xxx` })
}
</script>

1.2.1 校验rules中全部字段

validate

/**
 * 点击确认:校验 rules中全部字段
 */
const submitForm = () => {
  console.log('点确认了吗');
  proxy.$refs['formName'].validate(valid => {
    console.log(valid, '是否校验成功');
    if (valid) {
      if (type === '修改') {
         update({ id: detailId, ...form.value }).then(res => {
           if (res.code === 200) {
             proxy.$modal.msgSuccess('修改成功')
             handleClick()
           }
         })
      }
    }
  })
}

遇到的问题

  1. 描述:this.$refs[‘formName’].validate((valid) =>{} ))无效,即 校验成功但 获取不到valid的值
  2. 打印截图
    在这里插入图片描述
    在这里插入图片描述
  3. 原因:rules中 每个字段,在自定义校验规则时 的 validator 中。每个 if 都要对应一个 else ,且每个条件下都要 确保执行 callback
  4. 解决
    ① 解决前
    在这里插入图片描述
    ② 解决后
    在这里插入图片描述

1.2.2 校验 rules 中 指定字段

某个字段:validateField('xxx',vaild=>{})
某俩字段:validateField(['xxx', 'xxx'], valid =>{})

/**
 * 点击确认:校验 rules中指定字段
 */
const submitForm = () => {
  proxy.$refs['formName'].validateField('phonenumber', valid => {
    if (valid) {
      if (type === '修改') {
        update({ id: detailId, ...form.value }).then(res => {
          if (res.code === 200) {
            proxy.$modal.msgSuccess('修改成功')
            handleClick()
          }
        })
      }
    }
  })
}

二. 校验规则

2.1 邮箱

/**
 * @param {string} email
 * @returns {Boolean}
 */
export function validEmail(email) {
  const reg = /^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*\.(com|cn|net)$/
  return reg.test(email)
}

2.2 手机号

/**
 * @param {String} phoneNumber
 * @returns {Boolean}
 */
export function validPhoneNumber(phoneNumber) {
  const reg = /^1(3|4|5|7|8|9)\d{9}$/
  return reg.test(phoneNumber)
}

三. 知识点

3.1 useRouter() 和 useRoute() 的区别

3.2 reactive 和 ref 的区别

3.3 el-form 全部校验 和 指定某字段校验

必须确保 callback 的执行

3.4 toRef 和 toRefs 的应用和区别

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【opencv】示例-grabcut.cpp 使用OpenCV库的GrabCut算法进行图像分割

left mouse button - set rectangle SHIFTleft mouse button - set GC_FGD pixels CTRLleft mouse button - set GC_BGD pixels 这段代码是一个使用OpenCV库的GrabCut算法进行图像分割的C程序。它允许用户通过交互式方式选择图像中的一个区域&#xff0c;并利用GrabCut算法尝试…

idea项目编译时报错:GC overhead limit exceeded

问题描述 今天idea构建一个新的项目时报错&#xff1a;GC overhead limit exceeded&#xff0c;错误是发生在编译阶段&#xff0c;而不是运行阶段。 ava: GC overhead limit exceeded java.lang.OutOfMemoryError: GC overhead limit exceededat com.sun.tools.javac.resources…

STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978(2)

接前一篇文章&#xff1a;STM32H743VIT6使用STM32CubeMX通过I2S驱动WM8978&#xff08;1&#xff09; 本文参考以下文章及视频&#xff1a; STM32CbueIDE Audio播放音频 WM8978 I2S_stm32 cube配置i2s录音和播放-CSDN博客 STM32第二十二课&#xff08;I2S&#xff0c;HAL&am…

STM32 串口接收定长,不定长数据

本文为大家介绍如何使用 串口 接收定长 和 不定长 的数据。 文章目录 前言一、串口接收定长数据1. 函数介绍2.代码实现 二、串口接收不定长数据1.函数介绍2. 代码实现 三&#xff0c;两者回调函数的区别比较四&#xff0c;空闲中断的介绍总结 前言 一、串口接收定长数据 1. 函…

pbootcms百度推广链接打不开显示404错误页面

PbootCMS官方在2023年4月21日的版本更新中&#xff08;对应V3.2.5版本&#xff09;&#xff0c;对URL参数添加了如下判断 if(stripos(URL,?) ! false && stripos(URL,/?tag) false && stripos(URL,/?page) false && stripos(URL,/?ext_) false…

Composer安装与配置

Composer&#xff0c;作为PHP的依赖管理工具&#xff0c;极大地简化了PHP项目中第三方库的安装、更新与管理过程。本文将详细介绍Composer的安装步骤、基本配置方法&#xff0c;以及一些实用的操作示例&#xff0c;帮助读者快速上手并熟练运用Composer。 一、Composer安装 环…

Python --- 怎么把Python当计算器用?(小白自学笔记)

怎么把Python当计算器用&#xff1f;(小白自学笔记) Part I&#xff1a;标准数学包的导入 今天刚刚装了python&#xff0c;打算用它来取代matlab的基本计算功能&#xff0c;当我的日常计算器用。(这里还有一个捷径&#xff0c;如果你跟我一样也是纯小白的话&#xff0c;直接问c…

如何确保软件通过SmartScreen验证,消除用户下载时的警告提示?

在当前的网络时代&#xff0c;各种软件应用程序深深渗透到人们的日常生活和工作中&#xff0c;许多企业选择自行开发应用程序以推进其业务发展。但在发布应用程序后&#xff0c;软件所有者经常会遇到一个挑战&#xff0c;即用户在下载时可能会遇到微软SmartScreen提示“此应用程…

JVM修炼之路【11】- 解决内存溢出、内存泄漏 以及相关案例

前面的10篇 都是基础的知识&#xff0c;包括类加载的过程 类加载的细节&#xff0c;jvm内存模型 垃圾回收 等等&#xff0c; 这一篇我们开始实战了解一下 各种疑难杂症&#xff1a;怎么监控 怎么发现 怎么解决 内存溢出 内存泄漏 这两个概念在垃圾回收器里面已经讲过了&#…

Java前置一些知识

文章目录 搭建Java环境安装path环境变量Java技术体系 Java执行原理JDK组成跨平台Java内存分配 IDEA管理Java程序 搭建Java环境 安装 oralce官网下载 JDK17 Windows 傻瓜式的点下一步就行&#xff0c;注意&#xff1a;安装目录不要有空格、中文 java 执行工具 javac 编译工具…

2024年第十四届MathorCup数学应用挑战赛C题解析(更新中)

2024年第十四届MathorCup数学应用挑战赛C题解析&#xff08;更新中&#xff09; 题目题目解析(更新中&#xff09;问题一问题二问题三 题目 C题 物流网络分拣中心货量预测及人员排班电商物流网络在订单履约中由多个环节组成&#xff0c;图1是一个简化的物流 网络示意图。其中&a…

状态模式:管理对象状态转换的动态策略

在软件开发中&#xff0c;状态模式是一种行为型设计模式&#xff0c;它允许一个对象在其内部状态改变时改变它的行为。这种模式把与特定状态相关的行为局部化&#xff0c;并且将不同状态的行为分散到对应的状态类中&#xff0c;使得状态和行为可以独立变化。本文将详细介绍状态…

ActiveMQ 01 消息中间件jmsMQ

消息中间件之ActiveMQ 01 什么是JMS MQ 全称&#xff1a;Java MessageService 中文&#xff1a;Java 消息服务。 JMS 是 Java 的一套 API 标准&#xff0c;最初的目的是为了使应用程序能够访问现有的 MOM 系 统&#xff08;MOM 是 MessageOriented Middleware 的英文缩写&am…

django基于python的法院执法案件管理系统

本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中&#xff0c;方便对数据进行操作本课题基于WEB的开发平台&#xff0c;设计的基本思路是&#xff1a; 框架&#xff1a;django/flask 后端&#xff…

LwIP 之八 详解 IP RAW 编程、示例、API 源码、数据流

我们最为熟知的网络通信程序接口应该是 Socket。LwIP 自然也提供了 Socket 编程接口,不过,LwIP 的 Socket 编程接口都是使用最底层的接口来实现的。我们这里要学习的 IP RAW 编程则是指的直接使用 LwIP 的提供的 RAW API 来直接实现应用层功能。这里先来一张图,对 LwIP 内部…

【Godot4自学手册】第三十六节圆形移动或扇形移动的铁球

在第三十四节我实现了来回无限滚动的伤害铁刺球&#xff0c;这一节我准备实现一个圆形移动或扇形移动&#xff0c;并带有链条的铁球。效果如下&#xff1a; 一、实现原理 绕一点做圆周运动&#xff0c;简单的说就是&#xff1a; 每一帧根据旋转的角度计算出下一个位置的坐标…

【c++leetcode】14. Longest Common Prefix

问题入口 解决方案 class Solution { public:string longestCommonPrefix(vector<string>& v) {string ans "";sort(v.begin(), v.end());int n v.size();string first v[0],last v[n - 1];for(int i 0; i < min(first.size(),last.size()); i){…

实现网站图片水印

要实现网站图片水印&#xff0c;有几种方式&#xff1a;1、对于自己想要上传图片先通过某些软件增加水印&#xff0c;然后再上传到图片服务器。2、通过上传客户端&#xff08;eg&#xff1a;picgo&#xff09;功能或插件直接自动水印以及上传服务器。本文主要聚焦于第二种方式&…

前端重置表单的多个Demo

目录 前言1. 纯重置2. reset重置3. resetFields重置4. 彩蛋 前言 由于从Java转全栈&#xff0c;对于前端的相关知识目前 以点科普面&#xff0c;此处的总结 重置前端表单内容&#xff0c;防止影响后续操作 其基本知识只需要通过点击按钮触发重置表单 1. 纯重置 可以通过按钮…

跟TED演讲学英文:The exciting, perilous journey toward AGI by Ilya Sutskever

The exciting, perilous journey toward AGI Link: https://www.ted.com/talks/ilya_sutskever_the_exciting_perilous_journey_toward_agi? Speaker: Ilya Sutskever Date: October 2023 文章目录 The exciting, perilous journey toward AGIIntroductionVocabularyTranscr…