Vue3大事件项目1 登录注册验证

创建项目

b54a388b53b643d48a040e49d7b5d14b.png

引入 element-ui 组件库

4f066e598fe846d98d30ccf4e09d3cfb.png

登录:注册样式准备之后,配置校验规则(4个条件:一数据、二规则)

1. 校验相关
       (1) 给当前表单绑上整个的数据对象:el-form => :model="ruleForm"      绑定的整个form的数据对象 { xxx, xxx, xxx }  (<el-form-item> </el-form-item>)

<el-form:model="formModel">
const formModel = ref({username: '',password: '',repassword: ''
})


       (2) 绑上对应的校验规则:el-form => :rules="rules"         绑定的整个rules规则对象  { xxx, xxx, xxx }(注意一一对应)  (<el-form-item> </el-form-item>)

<el-form:model="formModel":rules="rules"  
>
const rules = {username: [{required: true,message: 'please',//blur:失焦触发,change:值改变的时候触发trigger: 'blur'},{min: 5,max: 10,message: 'yhum',trigger: 'blur'}],password: [{required: true,message: 'please',//blur:失焦触发,change:值改变的时候触发trigger: 'blur'},{pattern: /^\S{6,15}$/,message: '6-15'}]
}


       (3) 表单元素 => v-model="ruleForm.xxx" 给表单元素,绑定form的子属性,用户输入的内容才会同步到表单里去。(<el-input><</el-input>)

 <el-inputv-model="formModel.repassword":prefix-icon="Lock"type="password"placeholder="请输入再次密码"></el-input>


       (4) el-form-item => prop配置生效的是rules里的哪个校验规则 (和rules中的字段要对应)   (<el-form-item> </el-form-item>)

 <el-form-item prop="username"><el-inputv-model="formModel.username":prefix-icon="User"placeholder="请输入用户名"></el-input></el-form-item>

2.

(1)整个表单的校验规则

                1.非空校验 required:true message信息提示 trigger:触发校验的时机
                2.长度校验 min:xx,max:xx
                3.正则校验pattern:正则规则     \s  非空校验
                4.自定义校验 => 自己写逻辑校验(校验函数)   validator:(rule,value,callback) 

  • rule   当前校验规则相关的信息
  • value   所校验的表单元素目前的表单值
  • callback   两种校验方式,{第一种:callback() 代表校验成功。第二种:callback(new Error(错误信息))   代表校验失败。}无论成功还是失败,都要回调     

(2)自定义校验规则

目录

创建项目

引入 element-ui 组件库

登录:注册样式准备之后,配置校验规则(4个条件)


 

全部代码

<script setup>
import { User, Lock } from '@element-plus/icons-vue'
import { ref } from 'vue'
const isRegister = ref(true)
//整个的用于提交的form数据对象
const formModel = ref({username: '',password: '',repassword: ''
})
//整个表单的校验规则
//1.非空校验 required:true message信息提示 trigger:触发校验的时机
//2.长度校验 min:xx,max:xx
//3.正则校验pattern:正则规则
const rules = {username: [{required: true,message: 'please',//blur:失焦触发,change:值改变的时候触发trigger: 'blur'},{min: 5,max: 10,message: 'yhum',trigger: 'blur'}],password: [{required: true,message: 'please',//blur:失焦触发,change:值改变的时候触发trigger: 'blur'},{pattern: /^\S{6,15}$/,message: '6-15'}],repassword: [{required: true,message: 'please',//blur:失焦触发,change:值改变的时候触发trigger: 'blur'},{pattern: /^\S{6,15}$/,message: '6-15'},{validator: (rule, value, callback) => {if (value !== formModel.value.password) {callback(new Error('no'))} else {callback() //校验成功,也需要正常回调 callback()}},trigger: 'blue'}]
}
</script><template><el-row class="login-page"><el-col :span="12" class="bg"></el-col><el-col :span="6" :offset="3" class="form"><el-form:model="formModel":rulesref="form"size="large"autocomplete="off"v-if="isRegister"><el-form-item><h1>注册</h1></el-form-item><el-form-item prop="username"><el-inputv-model="formModel.username":prefix-icon="User"placeholder="请输入用户名"></el-input></el-form-item><el-form-item prop="password"><el-inputv-model="formModel.password":prefix-icon="Lock"type="password"placeholder="请输入密码"></el-input></el-form-item><el-form-item prop="repassword"><el-inputv-model="formModel.repassword":prefix-icon="Lock"type="password"placeholder="请输入再次密码"></el-input></el-form-item><el-form-item><el-button class="button" type="primary" auto-insert-space>注册</el-button></el-form-item><el-form-item class="flex"><el-link type="info" :underline="false" @click="isRegister = false">← 返回</el-link></el-form-item></el-form><el-form ref="form" size="large" autocomplete="off" v-else><el-form-item><h1>登录</h1></el-form-item><el-form-item prop="username"><el-inputv-model="formModel.username":prefix-icon="User"placeholder="请输入用户名"></el-input></el-form-item><el-form-item><el-inputname="password":prefix-icon="Lock"type="password"placeholder="请输入密码"></el-input></el-form-item><el-form-item class="flex"><div class="flex"><el-checkbox>记住我</el-checkbox><el-link type="primary" :underline="false">忘记密码?</el-link></div></el-form-item><el-form-item><el-button class="button" type="primary" auto-insert-space>登录</el-button></el-form-item><el-form-item class="flex"><el-link type="info" :underline="false" @click="isRegister = true">注册 →</el-link></el-form-item></el-form></el-col></el-row>
</template><style lang="scss" scoped>
.login-page {height: 100vh;background-color: #fff;.bg {background:url('@/assets/logo2.png') no-repeat 60% center / 240px auto,url('@/assets/login_bg.jpg') no-repeat center / cover;border-radius: 0 20px 20px 0;}.form {display: flex;flex-direction: column;justify-content: center;user-select: none;.title {margin: 0 auto;}.button {width: 100%;}.flex {width: 100%;display: flex;justify-content: space-between;}}
}
</style>

注册功能

1.新建 api/user.js 封装

import request from '@/utils/request'//注册接口
export const userRegisterService = ({ username, password, repassword }) => {//return 和 {} 可以省略//return request.post('/api/reg', { username, password, repassword })request.post('/api/reg', { username, password, repassword })
}

2.页面中调用(LoginPage.vue)

const register = async () => {//注册成功之前,先进行校验。校验成功,就发请求;校验失败,自动提示//调用validate会触发校验,给用户显示错误提示await form.value.validate()await userRegisterService(formModel.value)
//调用组件ElMessage.success('success')isRegister.value = false
}

3.eslintrc 中声明全局变量名, 解决 ElMessage 报错问题

module.exports = {...globals: {ElMessage: 'readonly',ElMessageBox: 'readonly',ElLoading: 'readonly'}
}


   

切换的时候,重置表单内容,利用watch监视

        当isRegister变量发生改变时,这段代码就会运行,并清空formModel对象中的所有表单输入字段,从而重置注册表单。watch 可以让你设置一个回调函数,当被监控的数据发生变化时,这个回调函数就会被执行 
 

watch(isRegister, () => {formModel.value = {username: '',password: '',repassword: ''}})

登录:封装登录接口

9d6e027f43b0420b9b4a29032974b8af.png

//登录接口post
//不能加花括号,否则就要加return
export const userLoginService = ({ username, password }) =>request.post('/api/login', {username,password})

登录:调用方法将 token 存入 pinia 并 自动持久化本地

//调store下的user里的setToken方法
const userStore = useUserStore()
//当你调用useRouter()函数时,它会返回一个路由实例对象,你可以通过这个对象来访问和操作路由相关的功能。
//记得导入
const router = useRouter()
const login = async () => {//登录前进行预校验,没通过就不能发请求await form.value.validate()//调用接口,发送数据const res = await userLoginService(formModel.value)//把返回的res存到pinia里面去,并且自动持久化到本地userStore.setToken(res.data.token)//给出提示,登录成功ElMessage.success('success')//跳转首页router.push('/')
}

 

 

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

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

相关文章

Notepad++软件安装及配置说明

Notepad是 Windows操作系统下的一套文本编辑器&#xff0c;有完整的中文化接口及支持多国语言编写的功能。 Notepad功能比 Windows自带记事本强大&#xff0c;除了可以用来制作一般的纯文字说明文件&#xff0c;也十分适合编写计算机程序代码。Notepad不但可以显示行号&#xf…

1572. 【基础赛】涂色(paint)

1572. 【基础赛】涂色&#xff08;paint&#xff09; (Input: paint.in, Output: paint.out) 时间限制: 2 s 空间限制: 256 MB 具体限制 题目描述 Introl获得了一个N行的杨辉三角&#xff0c;他将每行中值为奇数的位置涂为了黑色。 Chihiro将提出M次询问&#xff0c;在第L…

ELK日志

​​​​​​​

HJ53 杨辉三角的变形(基础数学,生成数组不行,会越界,使用规律)

第一种方法&#xff1a; 生成杨辉三角的方法不行&#xff0c;会出现越界&#xff0c; 数组从[0][0]开始&#xff0c;i行j列 只看列 每一行的最右侧坐标为2*i,下坐标为 0&#xff0c; 0&#xff0c;1&#xff0c;2 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4 … …

革命性突破:Stability AI发布全新12B参数Stable LM 2模型,颠覆AI界!

Stability AI已推出其Stable LM 2语言模型系列的最新成员&#xff1a;一个120亿参数的基础模型和一个经过指令调优的变体。这些模型在七种语言上训练&#xff0c;包括英语、西班牙语、德语、意大利语、法语、葡萄牙语和荷兰语&#xff0c;训练数据达到了令人印象深刻的两万亿个…

Linux:动态库加载、编址

目录 一、库的概念 二、动静态库的加载 2.1绝对编址与相对编址 2.1一般程序的加载 三、动态库的加载 一、库的概念 库默认就是一个磁盘级文件&#xff0c;所以在执行代码时&#xff0c;库和可执行程序都会被加载到内存中&#xff0c;从原理上&#xff0c;库函数的调用依旧…

结构型模式--1.适配器模式【托尼托尼·乔巴】

1. 翻译家 在海贼王中&#xff0c;托尼托尼乔巴&#xff08;Tony Tony Chopper&#xff09;是草帽海贼团的船医&#xff0c;它本来是一头驯鹿&#xff0c;但是误食了动物系人人果实之后可以变成人的形态。 乔巴吃了恶魔果实之后的战斗力暂且抛开不谈&#xff0c;说说它掌握的第…

[C++][算法基础]树的重心(树图DFS)

给定一颗树&#xff0c;树中包含 n 个结点&#xff08;编号 1∼n&#xff09;和 n−1 条无向边。 请你找到树的重心&#xff0c;并输出将重心删除后&#xff0c;剩余各个连通块中点数的最大值。 重心定义&#xff1a;重心是指树中的一个结点&#xff0c;如果将这个点删除后&a…

PostgreSQL入门到实战-第十四弹

PostgreSQL入门到实战 PostgreSQL数据过滤(七)官网地址PostgreSQL概述PostgreSQL中BETWEEN 命令理论PostgreSQL中BETWEEN 命令实战更新计划 PostgreSQL数据过滤(七) BETWEEN运算符允许您检查值是否在值的范围内。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容…

嵌入式网线连接——笔记本电脑设置

一、需求 我们调试很多设备经常需要用到网线去调试&#xff0c;当然主流是USB&#xff0c;和网线。 二、笔记本电脑端设备 有网口的&#xff0c;非常方便&#xff0c;如果没有网口&#xff0c;则需要用到USB转网口 连接指示灯&#xff1a; 绿色&#xff1a;灯亮表示连接正常…

风险评估在应对网络安全威胁中扮演着重要的角色

如今&#xff0c;IT 安全专家面临各种重大威胁&#xff0c;从勒索软件、网络钓鱼&#xff0c;到对基础设施的攻击&#xff0c;再到对知识产权、客户数据的窃取&#xff1b;从不安全的供应链合作伙伴&#xff0c;再到组织内部人员的恶意行为。同时&#xff0c;随着云计算、远程工…

顺序存储结构的读取、插入与删除

顺序线性表--L已经存在&#xff0c;且1 < index < ListLength(L) 一、获得元素操作--GetElem 含义&#xff1a;将线性表L中的第 index 个位置元素值返回 思路&#xff1a;只要 index 的数值在数组下标值范围内&#xff0c;把数组第 index-1下标的值返回即可 二、插入…

从零开始做自动驾驶定位(十三)_ 关于建图的讨论

从零开始做自动驾驶定位(十三): 关于建图的讨论 配套代码和测试数据&#xff1a;联系作者获取 附赠自动驾驶学习资料和量产经验&#xff1a;链接 代码在后续可能会有调整&#xff0c;如和文章有出入&#xff0c;以实际代码为准 系列文章进行到这里&#xff0c;建图部分算是基…

详细分析Vuex中的mapGetters

目录 1. 基本知识2. Demo13. Demo2 1. 基本知识 优势和用途 简化代码&#xff1a;用 mapGetters 和 mapState&#xff0c;可以简化组件中对于 Vuex 中状态和 getter 的映射工作&#xff0c;减少了重复的代码书写更易读&#xff1a;组件中直接使用映射的计算属性&#xff0c;使…

CSS设置文本

目录 概述&#xff1a; text-aling: text-decoration: text-transform: text-indent: line-height: letter-spacing: word-spacing: text-shadow: vertical-align: white-space: direction: 概述&#xff1a; 在CSS中我们可以设置文本的属性&#xff0c;就像Word文…

20 Games101 - 笔记 - 光场、颜色与感知

**20 ** 光场、颜色与感知 光场 眼睛成像 眼睛成像&#xff1a;我们看到这个三维世界&#xff0c;在眼睛里类似就是一幅二维的图。如果直接看到一幅记录了看到的光线信息的图&#xff0c;也能得到同样效果&#xff08;虚拟现实&#xff09;。 全光函数 全光函数可以描述…

Jupyter Notbook如何安装配置并结合内网穿透实现无公网IP远程连接使用

文章目录 推荐1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&am…

java swing个人财务收支管理系统eclipse开发Mysql数据库CS结构java编程

一、源码特点 java swing 个人财务收支管理系统 是一套完善的窗体设计系统&#xff0c;对理解SWING java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;&#xff0c;系统主要采用C/S模式开发。 应用技术&#xff1a;javamysql 开发工具&#xf…

web APIs总结(1)

1. 根据CSS选择器来获取DOM元素 (重点&#xff09; 获取一个DOM元素我们使用谁&#xff1f;能直接操作修改吗&#xff1f;querySelector() 可以返回值&#xff1a;CSS选择器匹配的第一个元素,一个 HTMLElement对象。如果没有匹配到&#xff0c;则返null 获取多个DOM元素我们使…

有时导数据代码比写SQL要快很多

一、背景 接到一个数据需求&#xff0c;是从我们的Mongo中导出的&#xff0c;但要取的值得到很深的层级&#xff0c;尝试写了半天Mongo的查询查不出来&#xff0c;问了半天大模型给的也不对&#xff0c;于是考虑写代码的方式 二、数据格式 // 1 {"_id": ObjectId(&…