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.pswp.cn/web/64826.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64826.shtml
英文地址,請注明出處:http://en.pswp.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;同時需要從公司服務器獲取所需的數據&#…