Vue.js 表单验证实战:一个简单的登录页面

修改日期备注
2025.1.2初版

一、前言

Vue.js 学习第一天——学会一个带有简单表单验证的登录页面。通过这个项目,会对 Vue.js 的核心概念有了更深入的理解,加深掌握如何运用 Vue 的一些强大特性来实现动态交互和数据处理。

二、项目的基本结构

首先,让我们来看一下这个项目的 HTML 结构:

<!DOCTYPE html>
<html lang="en"><head><title>Vue.js 登录页面</title><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><link href="style.css" rel="stylesheet" /><script src="https://unpkg.com/vue@latest"></script></head><body><div id="app"><form><input type="text" v-bind:class="{ 'input-error':!usernameIsValid }"placeholder="enter your username" v-model="username"/><br /><input type="password" v-bind:class="{ 'input-error':!passwordIsValid }"placeholder="enter your password" v-model="password"/><br /><button type="submit" v-on:click.prevent="submit">Login</button></form></div><script>const app = {data() {return {username:"",password:"",};},computed: {usernameIsValid() {return this.username.length >= 3;},passwordIsValid() {return this.password.length >= 3;}},methods: {submit() {if (!this.usernameIsValid ||!this.passwordIsValid) {alert("The input length smaller than 3");} else {alert(`Your input is username: ${this.username}; password: ${this.password}`);}}}};Vue.createApp(app).mount("#app");// vue的挂载</script></body>
</html>

在这个 HTML 页面中,我们使用 Vue.js 构建了一个简单的登录表单。

它的首页展示为:

image-20250102222208013

它包含以下几个部分:

三、引入 Vue.js 及页面设置

<head> 部分,我们进行了一些基础的页面设置和 Vue.js 的引入:

<head><title>Vue.js 登录页面</title><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1" /><link href="style.css" rel="stylesheet" /><script src="https://unpkg.com/vue@latest"></script>
</head>
  • <title> 为我们的页面设置了一个标题,方便在浏览器标签上显示。
  • <meta charset="UTF-8" /> 确保页面可以正确显示各种字符,避免出现乱码。
  • <meta name="viewport" content="width=device-width, initial-scale=1" /> 使页面在不同设备上能根据设备的宽度自适应显示,对于移动设备的适配非常重要哦。
  • <link href="style.css" rel="stylesheet" /> 引入了外部的样式表文件,我们会在后面的部分看到它是如何为页面添加样式的。
  • <script src="https://unpkg.com/vue@latest"></script> 是引入 Vue.js 的最新版本,这样我们就可以在页面中使用 Vue 的各种功能啦。

四、表单元素与 Vue 的双向绑定

<body> 部分,我们有一个 Vue 应用的根元素 <div id="app">,在这个元素内部是我们的表单:

<div id="app"><form><input type="text" v-bind:class="{ 'input-error':!usernameIsValid }"placeholder="enter your username" v-model="username"/><br /><input type="password" v-bind:class="{ 'input-error':!passwordIsValid }"placeholder="enter your password" v-model="password"/><br /><button type="submit" v-on:click.prevent="submit">Login</button></form>
</div>
  • 这里有两个输入框,一个用于输入用户名,一个用于输入密码。它们都使用了 v-model 指令进行双向绑定。以用户名输入框为例:
    • v-model="username" 把输入框的值和 Vue 实例中的 username 数据属性绑定在一起。这意味着当用户在输入框中输入内容时,username 的值会自动更新,反之,当我们在 Vue 代码中修改 username 的值,输入框的内容也会随之改变。这是 Vue 中非常方便的双向数据绑定特性哦 让数据的处理变得简单又直观。
  • 输入框还使用了 v-bind:class 指令:
    • v-bind:class="{ 'input-error':!usernameIsValid }" 是一种动态绑定类名的方式。这里,我们将输入框的类名和一个计算属性 usernameIsValid 关联起来。当 usernameIsValidfalse 时,输入框会被添加 input-error 类,当 usernameIsValidtrue 时,这个类不会被添加。这样可以根据用户输入的有效性动态地改变输入框的样式,是不是很酷呢?

五、Vue 实例中的数据和方法

接着我们来看看 <script> 部分的 Vue 实例:

const app = {data() {return {username:"",password:"",};},computed: {usernameIsValid() {return this.username.length >= 3;},passwordIsValid() {return this.password.length >= 3;}},methods: {submit() {if (!this.usernameIsValid ||!this.passwordIsValid) {alert("The input length smaller than 3");} else {alert(`Your input is username: ${this.username}; password: ${this.password}`);}}}
};
Vue.createApp(app).mount("#app");
  • 数据部分(data

    • data() 函数中定义了 usernamepassword 两个数据属性,它们分别存储用户输入的用户名和密码,初始值都为空字符串。这是我们用来保存用户输入的地方,它们会通过 v-model 与输入框进行双向绑定。
  • 计算属性(computed

    • usernameIsValid 计算属性用于判断用户名是否有效,通过 return this.username.length >= 3; 来检查 username 的长度是否大于或等于 3 个字符。这样,只要 username 的长度发生变化,usernameIsValid 的值就会自动更新。

      image-20250102222257302

    • 同样,passwordIsValid 计算属性会根据 password 的长度来判断密码是否有效。计算属性的优点是它会根据其依赖的数据自动更新,避免了我们手动更新状态,使代码更加简洁和易于维护。

      image-20250102222333990

  • 方法部分(methods

    • submit() 方法是在用户点击登录按钮时调用的。
    • if (!this.usernameIsValid ||!this.passwordIsValid) {...} 这里会检查用户名或密码是否长度不足 3 个字符。如果是,会弹出一个警告信息,告诉用户输入长度太短。
    • else {...} 部分则会在输入合法时,显示用户输入的用户名和密码,这里使用了模板字符串来方便地显示用户输入的信息。

六、样式处理(CSS)

我们的 style.css 文件也起着重要的作用,让我们看看其中的代码:

.input-error {border: 2px solid red;
}

这里定义了 .input-error 类,当输入框被添加这个类时,会显示一个 2 像素宽的红色边框。这与我们在 v-bind:class 中使用的类名相对应,当输入不满足长度要求时,输入框会显示红色边框,让用户知道输入有问题,增强了用户体验。

七、总结

通过这个简单的 Vue.js 登录页面项目,我们学习了很多重要的 Vue 特性:

  • 如何使用 v-model 进行双向数据绑定,使数据在页面和 Vue 实例之间轻松同步。
  • 利用 v-bind:class 进行动态的类名绑定,根据条件为元素添加不同的样式,让页面更加生动和具有交互性。
  • 使用计算属性来自动更新数据的状态,避免了手动更新和复杂的逻辑判断。
  • 实现了简单的表单验证逻辑,处理用户输入并提供反馈。

这个小项目只是 Vue.js 的冰山一角,但通过这样的实践,我们可以逐渐掌握 Vue 的核心概念和使用技巧。希望你也能动手尝试一下,相信你会对 Vue 有更深刻的理解和认识哦 继续加油,一起探索 Vue.js 的更多可能性吧 期待在 Vue 的世界里创造出更棒的项目!

八、后续改进

当然,这个项目还有很多可以改进的地方哦,比如:

  • 可以将验证逻辑扩展为更复杂的规则,例如检查用户名是否包含特殊字符,密码是否包含数字和字母等。
  • 可以将表单提交改为异步操作,通过调用后端 API 来验证用户信息,实现真正的登录功能。
  • 可以添加更多的用户反馈,例如使用 Vue 的组件系统创建一个专门的消息提示组件,取代 alert 函数,使页面更加美观。

注意:记得将 style.css 文件和上述 HTML 文件放在同一个目录下,这样才能正常加载样式哦。

户名是否包含特殊字符,密码是否包含数字和字母等。

  • 可以将表单提交改为异步操作,通过调用后端 API 来验证用户信息,实现真正的登录功能。
  • 可以添加更多的用户反馈,例如使用 Vue 的组件系统创建一个专门的消息提示组件,取代 alert 函数,使页面更加美观。

注意:记得将 style.css 文件和上述 HTML 文件放在同一个目录下,这样才能正常加载样式哦。

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

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

相关文章

MySQL 锁那些事

Q1 : MySQL有哪些锁,功能是什么,如何项目中使用?Q2 : 行锁是如何实现的?什么情况下会使用行锁?Q3 : 四种事务隔离形式的行锁有什么不一样?读未提交读提交可重复读串行 Q4 : MySQL 的读写都是怎样加锁的?Q5 : 需要注意什么? Q1 : MySQL有哪些锁,功能是什么,如何项目中使用…

国产文本编辑器EverEdit - 批量转码转换行符

1 批量转码&转换行符 1.1 应用场景 如果用户批量在Windows编辑文件&#xff0c;要上传到异构系统&#xff0c;如&#xff1a;Linux&#xff0c;则需要批量转换编码和换行符&#xff0c;此时可以使用EverEdit的批量转码功能。 1.2 使用方法 选择主菜单文档 -> 批量转码…

Java实现下载excel模板,并实现自定义下拉框

GetMapping("excel/download")ApiOperation(value "模板下载")public void getUserRecordTemplate(HttpServletResponse response, HttpServletRequest request) throws IOException {OutputStream outputStream response.getOutputStream();InputStream…

成立一家无人机培训机构需要哪些基础配置

成立一家无人机培训机构&#xff0c;需要一系列基础配置来确保教学质量、学员安全以及机构的正常运营。以下是根据公开发布的信息整理出的关键基础配置&#xff1a; 一、场地配置 1. 飞行场&#xff1a;提供一个安全、宽敞的室外飞行环境&#xff0c;面积最好大于三千平米&…

交换机性能详解

1. 背板带宽 只有模块化交换机&#xff08;拥有可扩展插槽&#xff0c;可灵活改变端口数量&#xff09;才有这个概念&#xff0c;固定端换机是没有这个概念的。并且固定端换机的背板容量和交换容量大小是相等的。 背板带宽是交换机的总数据处理能力&#xff0c;由硬件架构设…

读“将计算性能调高到极致的基点秘诀”的尝试

看到一篇文章&#xff0c;说最近阅读LAMMPS源码&#xff0c;悟出了很多道理。在计算性能优化这块&#xff0c;源代码作者很多写法我最初不以为意&#xff0c;后来发现是作者有意为之&#xff0c;就是为了把计算性能优化到极致。做计算仿真软件&#xff0c;也特别需要注意这些吧…

Gitea代码仓服务搭建

特点与优势 轻量级:Gitea是一个轻量级的Git服务,提供了快速、稳定的代码托管和协作开发环境。它资源占用低,适合在资源受限的环境中运行。易于安装和部署:Gitea提供了简单易用的安装和部署方式,支持多种安装方式,包括二进制文件、Docker容器等,并提供了详细的文档和配置…

leetcode hot 小偷

class Solution(object):def rob(self, nums):""":type nums: List[int]:rtype: int"""# 使用动态规划&#xff0c;把之前的给保存起来ans[0,nums[-1]]for i in range(1,len(nums)):ans.append(max(ans[-1],ans[-2]nums[-1*i-1]))return ans[-1]…

端口被占用

端口8080被占用 哈哈哈&#xff0c;我是因为后端项目跑错了&#xff0c;两个项目后端名称太像了&#xff1b; &#xff08;1&#xff09;netstat -aon | findstr 8080&#xff0c;找到占用8080端口的进程号&#xff0c;获取对应的进程号pid&#xff1b; &#xff08;2&#…

文件本地和OSS上传

这里写目录标题 前端传出文件后端本地存储阿里云OSS存储上传Demo实现上传ConfigurationProperties 前端传出文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传文件</title> </head&g…

[人工智能] 结合最新技术:Transformer、CLIP与边缘计算在提高人脸识别准确率中的应用

随着人工智能的快速发展&#xff0c;特别是深度学习和自然语言处理领域的革命性技术&#xff0c;越来越多的前沿技术被应用于人脸识别中。Transformer架构、CLIP模型以及边缘计算的结合&#xff0c;正成为提升人脸识别准确率和应用效能的关键技术路径。特别是在多样化场景下&am…

Python的*args和**kwargs

参考 总结&#xff1a; &#xff08;1&#xff09;*args用于在函数中处理传递的位置参数序列&#xff1b; &#xff08;2&#xff09;**kwargs则用于处理传递的关键字参数字典。 &#xff08;3&#xff09;示例&#xff1a; def complex_function(first, *args, **kwargs)…

Vue3 + ElementPlus动态合并数据相同的单元格(超级详细版)

最近的新项目有个需求需要合并单元列表。ElementPlus 的 Table 提供了合并行或列的方法&#xff0c;可以参考一下https://element-plus.org/zh-CN/component/table.html 但项目中&#xff0c;后台数据返回格式和指定合并是动态且没有规律的&#xff0c;Element 的示例过于简单&…

免费又开源:企业级物联网平台的新选择 ThingsPanel

在开源领域&#xff0c;选择合适的开源协议是开发者和企业能否充分利用平台的关键。ThingsPanel&#xff0c;作为一个专注于物联网的开源平台&#xff0c;近日将协议从 AGPLv3 改为更开放的 Apache 2.0。这一改变对开发者和用户意味着什么&#xff1f; 为什么协议要从 AGPLv3 转…

C# 设计模式(结构型模式):代理模式

C# 设计模式&#xff08;结构型模式&#xff09;&#xff1a;代理模式 在软件开发中&#xff0c;有时我们需要通过某种方式间接地访问一个对象&#xff0c;这时就可以使用代理模式&#xff08;Proxy Pattern&#xff09;。代理模式通过引入一个代理对象来控制对目标对象的访问…

关于AI面试系统2025年趋势评估!

在快速发展的科技浪潮中&#xff0c;AI技术正以前所未有的速度渗透到各行各业。企业招聘领域&#xff0c;作为人才选拔的关键环节&#xff0c;也不例外地迎来了AI面试系统的广泛应用和持续创新。2025年&#xff0c;AI面试系统不仅成为企业招聘的主流工具&#xff0c;更在智能化…

MySQL 01 02 章——数据库概述与MySQL安装篇

一、数据库概述 &#xff08;1&#xff09;为什么要使用数据库 数据库可以实现持久化&#xff0c;什么是持久化&#xff1a;数据持久化意味着将内存中的数据保存到硬盘上加以“固化”持久化的主要作用是&#xff1a;将内存中的数据存储在关系型数据库中&#xff0c;当然也可以…

Linux 挥别 WinXP 时代协议,USB RNDIS 即将退场

IT之家 1 月 2 日消息&#xff0c;Linux 基金会研究员 Greg Kroah-Hartman 计划在 Linux 内核中&#xff0c;彻底移除 USB RNDIS 协议驱动。 IT之家查询公开资料&#xff0c;USB RNDIS 是一种远程网络驱动接口规范&#xff0c;将 USB 设备模拟成网卡&#xff0c;从而在计算机和…

Vue3 组件

文章目录 Vue3 组件概述根组件定义和使用组件样式控制全局样式局部样式深度样式 Vue3 组件 概述 组件允许我们将 UI 划分为独立的、可重用的部分&#xff0c;并且可以对每个部分进行单独的思考。在实际应用中&#xff0c;组件常常被组织成层层嵌套的树状结构&#xff1a; 根…

怎么在家访问公司服务器?

在日常工作中&#xff0c;特别是对信息技术从业者而言&#xff0c;工作往往离不开公司的服务器。他们需要定期访问服务器&#xff0c;获取一些关键的机密文件或数据。如果您在家办公&#xff0c;并且需要处理未完成的任务&#xff0c;同时需要从公司服务器获取所需的数据&#…