Vue 3 登錄組件

Login.vue 組件詳細分析

在這里插入圖片描述

整體架構

Vue 3 登錄組件,采用 Composition API + Element Plus UI 庫,實現了完整的用戶認證界面。

模板結構分析

1. 容器布局

<div class="login-container"><el-card class="login-card"><!-- 內容 --></el-card>
</div>

設計特點:

  • 居中布局:使用 flexbox 實現水平垂直居中
  • 卡片容器:使用 Element Plus 的 Card 組件提供陰影和邊框效果
  • 響應式設計:固定寬度400px,適配各種屏幕

2. 表單結構

<el-formref="loginFormRef":model="loginForm":rules="rules"label-width="0px"
>

關鍵屬性分析:

  • ref=“loginFormRef”:獲取表單實例,用于調用驗證方法
  • :model=“loginForm”:綁定表單數據對象
  • :rules=“rules”:綁定驗證規則
  • label-width=“0px”:隱藏標簽,使用 placeholder 作為提示

3. 表單項設計

<el-form-item prop="username"><el-inputv-model="loginForm.username"prefix-icon="User"placeholder="請輸入用戶名"size="large"/>
</el-form-item>

UX 設計亮點:

  • 前綴圖標:使用 Element Plus 內置圖標提升視覺效果
  • 大尺寸輸入框size="large" 提升移動端體驗
  • 密碼可見性show-password 屬性允許用戶切換密碼顯示
  • 回車登錄@keyup.enter="handleLogin" 提升操作效率

4. 提示信息

<div class="login-tips"><p>管理員賬號:admin / 123456</p><p>普通用戶:zhangsan / 123456</p>
</div>

用戶體驗考慮:

  • 提供測試賬號,方便開發和演示
  • 降低用戶使用門檻

腳本邏輯分析

1. 導入和初始化

import { ref, reactive } from "vue";
import { useRouter } from "vue-router";
import { useStore } from "vuex";
import { ElMessage } from "element-plus";

技術棧分析:

  • Vue 3 Composition API:使用 refreactive 管理響應式狀態
  • Vue Router 4:使用 useRouter 進行路由跳轉
  • Vuex 4:使用 useStore 訪問狀態管理
  • Element Plus:UI 組件庫和消息提示

2. 響應式數據定義

const loginFormRef = ref();
const loading = ref(false);
const loginForm = reactive({username: "",password: "",
});

數據設計分析:

  • loginFormRef:表單組件引用,用于驗證操作
  • loading:加載狀態,防止重復提交
  • loginForm:表單數據,使用 reactive 使整個對象響應式

3. 表單驗證規則

const rules = {username: [{ required: true, message: "請輸入用戶名", trigger: "blur" }],password: [{ required: true, message: "請輸入密碼", trigger: "blur" }],
};

驗證策略:

  • 必填驗證:確保用戶名和密碼不為空
  • 失焦觸發:在用戶離開輸入框時進行驗證
  • 用戶友好:提供中文錯誤提示

4. 登錄處理邏輯

const handleLogin = async () => {const valid = await loginFormRef.value.validate();if (!valid) return;loading.value = true;try {await store.dispatch("login", loginForm);ElMessage.success("登錄成功");router.push("/");} catch (error) {ElMessage.error(error.message || "登錄失敗");} finally {loading.value = false;}
};

處理流程分析:

  1. 表單驗證

    const valid = await loginFormRef.value.validate();
    if (!valid) return;
    
    • 異步驗證所有表單項
    • 驗證失敗時直接返回,不執行后續邏輯
  2. 狀態管理

    loading.value = true;
    
    • 設置加載狀態,禁用按鈕,防止重復提交
  3. 登錄請求

    await store.dispatch("login", loginForm);
    
    • 調用 Vuex action 處理登錄邏輯
    • 傳遞完整的表單數據
  4. 成功處理

    ElMessage.success("登錄成功");
    router.push("/");
    
    • 顯示成功消息
    • 跳轉到首頁
  5. 錯誤處理

    catch (error) {ElMessage.error(error.message || "登錄失敗");
    }
    
    • 捕獲異常并顯示錯誤消息
    • 提供友好的錯誤提示
  6. 狀態清理

    finally {loading.value = false;
    }
    
    • 確保加載狀態被重置

樣式設計分析

1. 容器樣式

.login-container {height: 100vh;display: flex;justify-content: center;align-items: center;background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}

視覺設計:

  • 全屏高度:占滿整個視口
  • Flexbox 居中:水平垂直完美居中
  • 漸變背景:現代化的紫色漸變背景

2. 卡片樣式

.login-card {width: 400px;padding: 20px;
}

布局特點:

  • 固定寬度:確保在不同屏幕上的一致性
  • 內邊距:提供適當的內容間距

3. 細節樣式

.login-title {text-align: center;margin-bottom: 30px;color: #333;
}.login-tips {margin-top: 20px;text-align: center;color: #999;font-size: 14px;p {margin: 5px 0;}
}

用戶體驗優化:

  • 標題居中:視覺焦點突出
  • 提示文字:較小字號和淺色,不干擾主要內容
  • 適當間距:保持視覺層次清晰

技術特點

  • Vue 3 Composition API
  • TypeScript 友好的代碼結構
  • ES6+ 語法使用

2. 用戶體驗優化

  • 加載狀態指示
  • 表單驗證反饋
  • 快捷鍵支持(回車登錄)
  • 友好的錯誤提示

3. 代碼質量

  • 清晰的錯誤處理
  • 狀態管理規范
  • 組件職責單一

4. 可維護性

  • 良好的代碼組織
  • 明確的數據流向
  • 易于擴展的結構

1. 安全性增強

// 添加驗證碼功能
const captcha = ref('');
const captchaUrl = ref('');// 密碼強度驗證
const passwordRules = [{ required: true, message: "請輸入密碼", trigger: "blur" },{ min: 6, message: "密碼長度不能少于6位", trigger: "blur" }
];

2. 響應式優化

.login-card {width: 400px;padding: 20px;@media (max-width: 480px) {width: 90%;margin: 0 20px;}
}

3. 無障礙支持

<el-inputv-model="loginForm.username"prefix-icon="User"placeholder="請輸入用戶名"size="large"aria-label="用戶名"
/>
<!-- src/views/Login.vue -->
<template><div class="login-container"><el-card class="login-card"><h2 class="login-title">用戶管理系統</h2><el-formref="loginFormRef":model="loginForm":rules="rules"label-width="0px"><el-form-item prop="username"><el-inputv-model="loginForm.username"prefix-icon="User"placeholder="請輸入用戶名"size="large"/></el-form-item><el-form-item prop="password"><el-inputv-model="loginForm.password"type="password"prefix-icon="Lock"placeholder="請輸入密碼"size="large"show-password@keyup.enter="handleLogin"/></el-form-item><el-form-item><el-buttontype="primary"size="large"style="width: 100%":loading="loading"@click="handleLogin">登 錄</el-button></el-form-item></el-form><div class="login-tips"><p>管理員賬號:admin / 123456</p><p>普通用戶:zhangsan / 123456</p></div></el-card></div>
</template><script setup>
import { ref, reactive } from "vue";
import { useRouter } from "vue-router";
import { useStore } from "vuex";
import { ElMessage } from "element-plus";const router = useRouter();
const store = useStore();const loginFormRef = ref();
const loading = ref(false);const loginForm = reactive({username: "",password: "",
});const rules = {username: [{ required: true, message: "請輸入用戶名", trigger: "blur" }],password: [{ required: true, message: "請輸入密碼", trigger: "blur" }],
};const handleLogin = async () => {const valid = await loginFormRef.value.validate();if (!valid) return;loading.value = true;try {await store.dispatch("login", loginForm);ElMessage.success("登錄成功");router.push("/");} catch (error) {ElMessage.error(error.message || "登錄失敗");} finally {loading.value = false;}
};
</script><style scoped lang="scss">
.login-container {height: 100vh;display: flex;justify-content: center;align-items: center;background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}.login-card {width: 400px;padding: 20px;
}.login-title {text-align: center;margin-bottom: 30px;color: #333;
}.login-tips {margin-top: 20px;text-align: center;color: #999;font-size: 14px;p {margin: 5px 0;}
}
</style>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92804.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92804.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92804.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

小結: getSpringFactoriesInstances從 `spring.factories` 文件中加載和實例化指定類型的類

getSpringFactoriesInstances 方法工作原理 getSpringFactoriesInstances 是 Spring Boot 框架中的一個核心方法&#xff0c;用于從 spring.factories 文件中加載和實例化指定類型的類。這是 Spring Boot 實現自動配置和插件化擴展的關鍵機制。 1. 基本功能 該方法的主要作用是…

selenium SessionNotCreatedException問題解決辦法

在上周有一臺服務器重啟之后&#xff0c;Chrome瀏覽器也自動升了級&#xff0c;原本能夠正常使用的自動化辦公程序突然沒法用了&#xff0c;出現了下面的報錯提示。codes/addCancelBdld.py:980: DeprecationWarning: use options instead of chrome_optionsdriver webdriver.C…

SOAP HTTP Binding

SOAP HTTP Binding 引言 SOAP(Simple Object Access Protocol)是一種輕量級、簡單的協議,用于在網絡上交換結構化信息。它廣泛應用于Web服務中,用于實現不同系統和應用程序之間的通信。SOAP HTTP Binding是SOAP協議的一種實現方式,它允許使用HTTP協議來傳輸SOAP消息。本…

GPT-5免費使用教程(國內可訪問)

GPT-5來了&#xff0c;壓力給到各大AI模型廠商&#xff1f; 北京時間2025年8月7日&#xff0c;OpenAI 推出兩款開源模型 gpt-oss-120b / 20b&#xff0c;性能逼近 o4-mini/o3-mini&#xff0c;一時間火爆AI圈&#xff1b;但這好像只是一道開胃小菜&#xff0c;在北京時間2025年…

內存作假常見方案可行性分析

內存作假通常修改所涉及到的幾個文件&#xff1a;M sys/frameworks/base/core/java/android/app/ActivityManager.javaM sys/frameworks/base/core/jni/android_os_Debug.cppM sys/frameworks/base/core/jni/android_util_Process.cppM sys/frameworks/base/services/core/java…

C#(vs2015)利用unity實現彎管機仿真

以下是基于 Visual Studio 2015 和 Unity 實現彎管機仿真的完整技術流程&#xff0c;結合工業仿真開發的最佳實踐整理而成&#xff0c;涵蓋建模、通信、運動控制和交互邏輯等核心模塊&#xff1a;---一、環境配置與基礎框架搭建 1. Unity 與 VS2015 聯動 - 安裝 [Visual Studio…

華為USG防火墻雙機,但ISP只給了1個IP, 怎么辦?

華為USG防火墻雙機&#xff0c;但ISP只給了1個IP&#xff0c; 怎么辦&#xff1f; 華為USG雙機使用VRRP&#xff0c;需要3個Ip 本次聯通只給了 100.1.1.0/30 這一個互聯段 聯通側用了100.1.1.1&#xff0c; 我們這一側只有100.1.1.2 怎么辦&#xff1f; 找聯通多要幾個Ip&…

Go 工具鏈環境變量實戰:從“command not found”到工具全局可用的全流程復盤

在 Go 生態里&#xff0c;豐富的命令行工具極大提升了開發效率。但很多小伙伴第一次用 go install 安裝第三方工具后&#xff0c;卻遇到終端里找不到命令的尷尬——明明裝好了&#xff0c;終端卻報 “command not found”。這是為什么呢&#xff1f;本文結合我親身踩過的坑&…

MCU 軟件斷點注意事項!!!

——為什么調試器會在運行中改我的Flash程序&#xff1f;調試單片機時&#xff0c;很多人都有這樣的疑問&#xff1a;明明我在調試前刷進去的固件是好的&#xff0c;為什么加了一個斷點之后&#xff0c;調試器居然去改了 Flash&#xff1f; 如果我拔掉調試器&#xff0c;這個固…

騰訊iOA:數據安全的港灣

聲明&#xff1a;文章為本人真實測評&#xff0c;非廣告&#xff0c;無推廣&#xff0c;為用戶體驗文章 前言 當前網絡安全威脅日益復雜化&#xff0c;惡意軟件攻擊手段不斷升級。例如&#xff1a;釣魚郵件攜帶的偽裝安裝包可能引發勒索病毒在內網擴散&#xff0c;導致業務中斷…

相冊管理系統介紹

之前在github和gitee上了找了好久也沒找到符合自己需求的相冊管理系統&#xff0c;最近就靜下心來自己寫了一套。系統分為前臺相冊系統與后臺管理系統。 技術框架采用的是前端vueelementui&#xff0c;后端springbootmybatisplus。 下面是項目截圖&#xff1a;項目功能介紹&…

企業級高性能WEB服務器Nginx

nginx安裝 1.nginx編譯安裝 #在nginx官網獲取安裝包 [rootwebserver mnt]# wget https://nginx.org/download/nginx-1.24.0.tar.gz#解壓安裝包 [rootwebserver mnt]# tar zxf nginx-1.24.0.tar.gz [rootwebserver mnt]# cd nginx-1.24.0/#安裝編譯nginx需要的環境軟件 [rootw…

【Node.js從 0 到 1:入門實戰與項目驅動】1.3 Node.js 的應用場景(附案例與代碼實現)

文章目錄1.3 Node.js 的應用場景&#xff08;附案例與代碼實現&#xff09;1.3 Node.js 的應用場景&#xff08;附案例與代碼實現&#xff09;一、Web 服務器開發二、API 開發三、命令行工具&#xff08;CLI&#xff09;開發四、實時應用開發小結1.3 Node.js 的應用場景&#x…

No time to train! Training-Free Reference-Based Instance Segmentation之論文閱讀

摘要 圖像分割模型的性能歷來受到大規模標注數據收集成本高昂的制約。Segment Anything Model&#xff08;SAM&#xff09;通過一種可提示、與語義無關的分割范式緩解了這一根本問題&#xff0c;但在處理新圖像時&#xff0c;仍然需要手動提供視覺提示或依賴復雜的領域相關提示…

本地文件夾與 GitHub 遠程倉庫綁定并進行日常操作的完整命令流程

以下是將本地文件夾與 GitHub 遠程倉庫綁定并進行日常操作的完整命令流程&#xff0c;特別針對你的需求&#xff08;忽略數據集、偏好使用 rebase 保持主分支整潔&#xff09;進行了優化&#xff1a; 一、初始設置&#xff08;首次綁定&#xff09;在本地項目文件夾初始化 Git …

windows10 ubuntu 24.04 雙系統 安裝教程

準備windows安裝包解壓到u盤中作為啟動盤準備ubuntu安裝包https://ubuntu.com/download/desktop/thank-you?version24.04.3&architectureamd64<strue解壓到u盤中作為啟動盤準備磁盤分區安裝windows操作系統安裝disk geniusWindows 三個NTFS的分區System: windows操作系…

騰訊前端面試模擬詳解

以下是騰訊及騰訊音樂娛樂&#xff08;TME&#xff09;前端崗位高頻手撕題目詳解&#xff0c;結合真題及考察要點整理&#xff0c;覆蓋面試核心考點&#xff1a;?? 一、核心手撕題&#xff08;騰訊/TME 必考&#xff09; 1. Promise 并發控制&#xff08;90%場次出現&#xf…

微軟將于 10 月停止混合 Exchange 中的共享 EWS 訪問

使用 Exchange 混合部署的組織應為未來幾個月即將生效的新變化做好準備。微軟已宣布&#xff0c;自 2025 年 8 月起&#xff0c;將在某些混合環境中暫時阻止使用 Exchange Online 共享服務主體的 Exchange Web 服務 (EWS) 流量。 此項變更主要影響使用“豐富共存”功能的組織&a…

STM32CubeMX + HAL 庫:用硬件IIC接口實現AT24C02 EEPROM芯片的讀寫操作

1 概述1.1 實驗目的本實驗旨在通過 STM32 微控制器的硬件 IC 接口&#xff0c;對 AT24C02 外部 EEPROM 存儲芯片 進行讀寫操作。實驗演示了芯片地址配置、單字節/多字節讀寫、跨頁寫入&#xff08;Page Write&#xff09;功能。并提供完整的驅動代碼&#xff0c;幫助讀者深入理…

基于Android的音樂播放器/基于android studio的音樂系統/音樂管理系統

原生APP安卓開發設計之基于Android的音樂播放器/音樂系統/音樂管理系統[springboot]android studio