Vue 3项目实战:从零构建登录界面
创作时间:
作者:
@小白创作中心
Vue 3项目实战:从零构建登录界面
引用
CSDN
1.
https://blog.csdn.net/2401_83781937/article/details/140153811
本文详细介绍了如何将一个登录界面的HTML+CSS+JS项目转换为Vue 3项目,并通过构建组件和实现组件间通信,帮助读者掌握Vue 3的项目开发技巧。
一、概述
本文将带领大家完成一个Vue 3项目的实战演练,重点讲解如何将一个登录界面的HTML+CSS+JS项目转换为Vue项目。这个登录界面不仅美观,而且功能齐全,非常适合Vue初学者进行实践。
三、需求分析
通过运行源代码,我们可以将页面分为三个主要部分:
我们将这三个部分封装成组件,在src目录下新建login文件夹,用于存放该项目的相关文件。同时,需要对router/index.ts进行一些初始化配置:
import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router'
const routes: Array<RouteRecordRaw> = [
{ path: '/', component: () => import('@/login/login.vue') },
]
const router = createRouter({
history: createWebHashHistory(),
routes
})
export default router
四、构建组件
4.1 背景组件(父组件)
在login/login.vue文件中,我们首先创建了基本的HTML结构和样式:
<template>
<div class="body">
<div class="main">
adad
</div>
</div>
</template>
<script setup lang="ts">
</script>
<style scoped>
*, *::after, *::before {
margin: 0;
padding: 0;
box-sizing: border-box;
user-select: none;
}
.body {
width: 100%;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
font-family: "Montserrat", sans-serif;
font-size: 12px;
background-color: #ecf0f3;
color: #a0a5a8;
}
.main {
position: relative;
width: 1000px;
min-width: 1000px;
min-height: 600px;
height: 600px;
padding: 25px;
background-color: #ecf0f3;
box-shadow: 10px 10px 10px #d1d9e6, -10px -10px 10px #f9f9f9;
border-radius: 20px;
overflow: hidden;
}
@media (max-width: 1200px) {
.main {
transform: scale(0.7);
}
}
@media (max-width: 1000px) {
.main {
transform: scale(0.6);
}
}
@media (max-width: 800px) {
.main {
transform: scale(0.5);
}
}
@media (max-width: 600px) {
.main {
transform: scale(0.4);
}
}
</style>
4.2 Switch组件
Switch组件实现了滑动切换效果:
其核心代码如下:
<template>
<div class="switch" id="switch-cnt">
<div class="switch__circle"></div>
<div class="switch__circle switch__circle--t"></div>
<div class="switch__container" id="switch-c1">
<h2 class="switch__title title">Welcome Back !</h2>
<p class="switch__description description">To keep connected with us please login with your personal info</p>
<button class="switch__button button switch-btn" @click="change">SIGN IN</button>
</div>
<div class="switch__container is-hidden" id="switch-c2">
<h2 class="switch__title title">Hello Friend !</h2>
<p class="switch__description description">Enter your personal details and start journey with us</p>
<button class="switch__button button switch-btn" @click="change">SIGN UP</button>
</div>
</div>
</template>
<script setup lang="ts">
const change = () => {
const switchC1 = document.querySelector("#switch-c1") as any;
const switchC2 = document.querySelector("#switch-c2") as any;
const switchCircle = document.querySelectorAll(".switch__circle") as any;
const switchCtn = document.querySelector("#switch-cnt") as any;
switchCtn.classList.add("is-gx");
setTimeout(function(){
switchCtn.classList.remove("is-gx");
}, 1500)
switchCtn.classList.toggle("is-txr");
switchCircle[0].classList.toggle("is-txr");
switchCircle[1].classList.toggle("is-txr");
switchC1.classList.toggle("is-hidden");
switchC2.classList.toggle("is-hidden");
}
</script>
<style scoped>
@import './login.css';
</style>
4.3 Sign组件
Sign组件包括登录和注册两个表单:
其核心代码如下:
<!-- sign_up -->
<template>
<div class="container a-container" id="a-container">
<form class="form" id="a-form" method="" action="">
<h2 class="form_title title">Create Account</h2>
<div class="form__icons">
<img class="form__icon" src=" ">
<img class="form__icon" src=" ">
<img class="form__icon" src=" ">
</div>
<span class="form__span">or use email for registration</span>
<input class="form__input" type="text" placeholder="Name">
<input class="form__input" type="text" placeholder="Email">
<input class="form__input" type="password" placeholder="Password">
<button class="form__button button submit">SIGN UP</button>
</form>
</div>
</template>
<style scoped>
@import './login.css';
</style>
<!-- sign_in -->
<template>
<div class="container b-container" id="b-container">
<form class="form" id="b-form" method="" action="">
<h2 class="form_title title">Sign in to Website</h2>
<div class="form__icons">
<img class="form__icon" src=" ">
<img class="form__icon" src=" ">
<img class="form__icon" src=" ">
</div>
<span class="form__span">or use your email account</span>
<input class="form__input" type="text" placeholder="用户名" v-model="loginFrom.username">
<input class="form__input" type="password" placeholder="密码" v-model.lazy="loginFrom.password">
<a class="form__link">Forgot your password?</a>
<button class="form__button button submit">SIGN IN</button>
</form>
</div>
</template>
<style scoped>
@import './login.css';
</style>
五、Vue组件之间的通信
为了实现Switch组件的按钮事件能够控制Sign组件的显示和隐藏,我们需要借助Event Bus。以下是具体实现步骤:
- 安装mitt库:
npm i mitt - 在
main.ts中声明Event Bus:
// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import mitt from 'mitt'
const app=createApp(App)
app.config.globalProperties.emitter = mitt()
app.use(router)
app.mount('#app')
- 在
src/hooks/useEmitter.js中封装Event Bus:
// src/hooks/useEmitter.js
import { getCurrentInstance } from 'vue'
export default function useEmitter() {
const internalInstance = getCurrentInstance()
const emitter = internalInstance.appContext.config.globalProperties.emitter
return emitter
}
- 在Switch组件中添加Event Bus的发送代码:
<script setup lang="ts">
import { ref } from 'vue'
import useEmitter from '@/hooks/useEmitter.js'
const sidebarOpen = ref(true)
const emitter = useEmitter()
const change = () => {
const switchC1 = document.querySelector("#switch-c1") as any;
const switchC2 = document.querySelector("#switch-c2") as any;
const switchCircle = document.querySelectorAll(".switch__circle") as any;
const switchCtn = document.querySelector("#switch-cnt") as any;
switchCtn.classList.add("is-gx");
setTimeout(function(){
switchCtn.classList.remove("is-gx");
}, 1500)
switchCtn.classList.toggle("is-txr");
switchCircle[0].classList.toggle("is-txr");
switchCircle[1].classList.toggle("is-txr");
switchC1.classList.toggle("is-hidden");
switchC2.classList.toggle("is-hidden");
sidebarOpen.value = !sidebarOpen.value
emitter.emit('change', sidebarOpen.value)
}
</script>
- 在Sign组件中添加Event Bus的接收代码:
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import useEmitter from '@/hooks/useEmitter.js'
const emitter = useEmitter()
onMounted(() => {
emitter.on('change', (isOpen : boolean) => {
let aContainer = document.querySelector("#a-container") as any;
aContainer.classList.toggle("is-txl");
})
})
</script>
通过以上步骤,我们完成了Vue 3项目的实战演练,不仅掌握了组件的构建方法,还学会了如何实现组件间的通信。希望这篇文章能帮助你更好地理解Vue 3的开发技巧。
热门推荐
受失恋影响情绪低落怎么办?有效的失恋抑郁症治疗方法有哪些?
车牌号的奥秘:寓意与选择标准
大众双离合变速箱质量到底怎么样?值得买吗?听听修理工怎么说!
寿险的定义怎样明确?明确寿险定义需要注意什么?
必看!狗狗怀孕期间的科学饮食指南
手指关节囊破裂:症状、原因及并发症
免疫力是健康“防护罩”!多吃这些水果蔬菜,为你的免疫系统加分
春节游文山丨多彩“非遗”陪你过大年!
SOS紧急呼叫系统使用指南:如何保障您的安全
勇士3连胜后,巴特勒正式确认,科尔也很坦率,库里成大赢家
内部短路起火时间不到3秒,王朝阳揭示全固态金属锂电池安全隐患
大唐河西英雄传:张议潮和他的“归义军”
恋爱中如何和女生相处
麦芽糖浆是什么东西
苹果蒸鸡蛋有哪些功效
哪吒2:哪吒敖丙跟申公豹,其实是同一种人
律师高级合伙人:角色、权力和职责解析
肥胖代谢表型与慢性肾病风险的关系研究
饱和度:色彩的浓度与纯度
央企整合风暴:破解供应链“卡点”“堵点”
购买二手牧马人和名爵需要注意哪些方面?
数字经济时代下的创新创业机遇
107家券商2024年分类评价出炉!九大加分项、五大扣分点 旨在突出机构功能性
三国杀安卓版武将牌一览表:武将特性与搭配攻略
职业规划中的职业导师与指导
3月旅行不扎堆,这7个小众目的地,春光绝美
好消息!合肥地铁建设加速,多条线路有最新进展
甜蜜的陷阱:警惕食物中隐藏的糖分
五行和健康的关系,缺什么对身体不好
浅谈清朝时期花钱的发展概述及其文化习俗