今天是開發的Day7,開發重點為:
v-if
提醒使用者登入錯誤<template>
中利用v-if
與模板語法新增errMsg
<!-- 錯誤訊息 -->
<p v-if="errMsg" class="text-red">{{ errMsg }}</p>
<script setup>
中定義errMsg,以及跟註冊差不多步驟一樣應用firebase本身的語法(signInWithEmailAndPassword
)/**
* 登入function與error code
*/
const errMsg = ref()
const SignIn = () => {
const auth = getAuth()
signInWithEmailAndPassword(auth, userInfo.value.email, userInfo.value.pwd)
.then((data) => {
// 利用firebase的語法登入
console.log("successfully Signin", auth.currentUser, data)
// 登入後回到Homepage
pushToOtherPage("HomePage")
})
.catch((error) => {
console.error("Login Fail: ", error.code)
// 按照各種條件跳出不同的錯誤訊息
switch (error.code) {
case "auth/invalid-email":
errMsg.value = "Invalid email"
break
case "auth/user-not-found":
errMsg.value = "No account with that email was found"
break
case "auth/wrong-password":
errMsg.value = "Incorrect password"
break
case "auth/too-many-requests":
errMsg.value = "too-many-requests"
break
default:
errMsg.value = "Email or password was incorrect"
break
}
// 顯示訊息給使用者
})
}
signOut
按鈕,如果使用者是登入狀態時才會顯示 <button
v-bind:class="[customizeStyle(buttonCustomizaStyleAttribute)]"
@click="SignOut"
v-if="isLoggedIn"
>
Sign out
</button>
import { onMounted } from "vue"
import { getAuth, onAuthStateChanged } from "firebase/auth"
const isLoggedIn = ref(false)
let auth
onMounted(() => {
auth = getAuth()
onAuthStateChanged(auth, (user) => {
if (user) {
isLoggedIn.value = true
} else {
isLoggedIn.value = false
}
})
})
onMounted
?注册一个回调函数,在组件挂载完成后执行。
这个钩子通常用于执行需要访问组件所渲染的 DOM 树相关的副作用,或是在服务端渲染应用中用于确保 DOM 相关代码仅在客户端执行。
这个钩子在服务器端渲染期间不会被调用。
來源:官方文件—生命週期鉤子
使用 onMounted 的主要目的是確保初始化時可以獲取身份驗證狀態,並在組件生命周期的正確階段設置相應的事件監聽器。
確保了在組件安裝到 DOM 之後,立即獲取當前身份驗證狀態,並在以後的變化中保持同步。
/**
* 驗證使用者是否是登入狀態
*/
import { createApp } from "vue"
import App from "../App.vue"
import { onAuthStateChanged } from "firebase/auth"
import { auth } from "../firebaseConfig.js" // Firebase auth 實例
const app = createApp(App)
// 在 Vue 3 中,需要使用 provide 和 inject 來全局訪問 auth 實例
app.provide("auth", auth)
// 在應用程序初始化時監聽用戶的身份狀態變化
onAuthStateChanged(auth, (user) => {
if (user) {
// 用戶已經登錄,可以執行相應的處理
console.log("User is logged in:", user)
// 根據用戶的身份狀態進行相應的導航
// 在已經登入的狀態下,導入HomePage
router.push({ name: "HomePage" }) // 導向已驗證的頁面
} else {
// 用戶未登錄或登出的情況下,導入LoginPage
console.log("User is logged out")
router.push({ name: "LoginPage" })
}
})
大致完成了跳轉頁面的功能,但仍需要拆分firebase本身的功能,希望能讓代碼更精簡。