【Vue-Router】導航守衛

前置守衛

main.ts

import { createApp } from 'vue'
import App from './App.vue'
import {router} from './router'
// import 引入
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
const app = createApp(App)
app.use(router)
// use 注入 ElementPlus 插件
app.use(ElementPlus)const whiteList = ['/']// beforeEach 可以定義不止一個,vue會收集所有定義的路由鉤子,所以next的作用不應該是跳轉,而是使步驟進行到下一個你定義的鉤子
router.beforeEach((to, from, next) => {// token每次都要跟后端校驗一下是否過期if(whiteList.includes(to.path) || localStorage.getItem('token')){next()}else{next('/')}
})
app.mount('#app')

在這里插入圖片描述

index.ts

import { createRouter, createWebHistory } from 'vue-router'export const router = createRouter({// import.meta.env.BASE_URL 應用的基本 URL。基本 URL 是指在你的應用部署到某個域名或子路徑時,URL 的起始部分。例如,如果你的應用部署在 https://example.com/myapp/ 這個路徑下,那么 import.meta.env.BASE_URL 就會是 /myapp/。history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',component: () => import('@/views/Login.vue'),},{path: '/index',component: () => import('@/views/Index.vue'),},],
})

App.vue

<template><router-view></router-view>
</template><script setup lang="ts"></script><style>
/* 注意 style 標簽 別加 scoped 不然設置寬高不生效 */
* {margin: 0;padding: 0;
}
html, body, #app {height: 100%;overflow: hidden;
}
</style>

Login.vue

<template><div class="login"><el-card class="box-card"><el-form ref="form" :rules="rules" :model="formInline" class="demo-form-inline"><el-form-item prop="user" label="賬號:"><el-input v-model="formInline.user" placeholder="請輸入賬號" /></el-form-item><el-form-item prop="password" label="密碼:"><el-input v-model="formInline.password" placeholder="請輸入密碼" type="password"></el-input></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">登錄</el-button></el-form-item></el-form></el-card></div>
</template><script setup lang="ts">
import { reactive, ref } from 'vue'
import { useRouter } from 'vue-router'
import type { FormItemRule, FormInstance } from 'element-plus';
import { ElMessage } from 'element-plus'const router = useRouter()
type Form = {user: string,password: string
}
type  Rules = {[k in keyof Form]?: Array<FormItemRule>
}
const formInline = reactive<Form>({user: '',password: '',
})
const form = ref<FormInstance>()
const rules = reactive({user: [{required: true,message: '請輸入賬號',type: 'string',}],password: [{required: true,message: '請輸入密碼',type: 'string',}]
})const onSubmit = () => {console.log('submit!', form.value)form.value?.validate((validate)=>{if (validate) {router.push('/index')localStorage.setItem('token', '1')} else {ElMessage.error('賬號或密碼錯誤')}})}
</script><style scoped lang="less">
.login {height: 100%;display: flex;justify-content: center;align-items: center;
}
</style>

在這里插入圖片描述

剛開始未登錄過,不能使用輸入 /index 的方式跳轉,localStorage 不能讀取 token

在這里插入圖片描述

登錄之后可以使用輸入 /index 的方式跳轉,localStorage 已存儲 token

在這里插入圖片描述

后置守衛

注冊全局后置鉤子,和前置守衛不同,這些鉤子不會接受 next 函數,也不會改變導航本身。

例如:添加一個加載進度條功能

在這里插入圖片描述
loadingBar.vue

<template><div class="wraps"><div ref="bar" class="bar"></div></div>
</template><script setup lang="ts">
import { ref, onMounted } from 'vue'
let speed = ref<number>(1)
let bar = ref<HTMLElement>()
let timer = ref<number>(0)
const startLoading = () => {speed.value = 1let dom = bar.value as HTMLElementtimer.value = window.requestAnimationFrame(function fn() {if (speed.value < 90) {speed.value += 1;dom.style.width = speed.value + '%'timer.value = window.requestAnimationFrame(fn)} else {speed.value = 1window.cancelAnimationFrame(timer.value)}})
}
const endLoading = () => {let dom = bar.value as HTMLElementsetTimeout(() => {window.requestAnimationFrame(() => {speed.value = 100dom.style.width = speed.value + '%'})}, 500)}defineExpose({ startLoading, endLoading })
</script><style scoped lang="less">
.wraps {width: 100%;position: fixed;height: 10px;top: 0;.bar {height: inherit;width: 0;background-color: #409eff;}
}
</style>

main.ts

import { createApp,createVNode,render } from 'vue'
import App from './App.vue'
import {router} from './router'
// import 引入
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import loadingBar from './components/loadingBar.vue'const Vnode = createVNode(loadingBar)
render(Vnode,document.body)
const app = createApp(App)
app.use(router)
// use 注入 ElementPlus 插件
app.use(ElementPlus)const whiteList = ['/']// beforeEach 可以定義不止一個,vue會收集所有定義的路由鉤子,所以next的作用不應該是跳轉,而是使步驟進行到下一個你定義的鉤子
router.beforeEach((to, from, next) => {Vnode.component?.exposed?.startLoading()// token每次都要跟后端校驗一下是否過期if(whiteList.includes(to.path) || localStorage.getItem('token')){next()}else{next('/')}
})router.afterEach((to, from) => {Vnode.component?.exposed?.endLoading()
})
app.mount('#app')

在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

ShowMeBug CEO李亞飛受邀參加深圳青年創新創業系列沙龍電子信息專場

7月13日下午&#xff0c;由深圳市科技交流服務中心&#xff08;深圳市科技專家委員會辦公室&#xff09;主辦&#xff0c;深圳新一代產業園承辦的“2023深圳青年創新創業系列沙龍——電子信息專場”活動舉行。ShowMeBug CEO李亞飛受邀參加此次活動。 深圳市科學技術協會黨組成員…

微信小程序真機調試異常cmdId 1006, errCode-50011-已解決

cmdId 1006, errCode-50011 起因 小程序在模擬器上預覽沒問題,真機調試和體驗版首頁打不開,點展開顯示cmdId 1006, errCode-50011 解決 查了下1006, 說是廣告, 我沒接廣告,這個也不是錯誤碼 1006廣告組件被駁回你的廣告正在被審核,無法展現廣告后來找到幾個類似的帖子…

arm開發板 GDB遠程調試方法

1.前言 1.在linux下開發&#xff0c;免不了使用gdb調試&#xff0c;但是linux下開發嵌入式&#xff0c;都是跑在ARM板子上的&#xff0c;網上有很多GDB的基礎教程&#xff0c;但是能在ARM開發板用的時候&#xff0c;會有各種問題。 比如&#xff1a;*.cpp: No such file or di…

Android su

1. userdebug和user版本 2. 關閉selinux system/core diff --git a/init/selinux.cpp b/init/selinux.cpp index 5a0255acd..787917274 100644--- a/init/selinux.cpp b/init/selinux.cpp -104,6 104,8 EnforcingStatus StatusFromCmdline() { } bool IsEnforcing() { …

元宇宙時代超高清視音頻技術白皮書關于流媒體協議和媒體傳輸解讀

流媒體協議 元宇宙業務場景對流媒體傳輸的實時性和互動性提出了更高的要求&#xff0c;這就需要在傳統的 RTMP、SRT、 HLS 等基礎上增加實時互動的支持。實時互動&#xff0c;指在遠程條件下溝通、協作&#xff0c;可隨時隨地接入、實時地傳遞虛實融合的多維信息&#xff0c;身…

萬賓燃氣管網監測解決方案,守護城市生命線安全

方案背景 城市燃氣管網作為連接天然氣長輸管線與天然氣用戶的橋梁&#xff0c;擔負著向企業和居民用戶直接供氣的重要職責。隨著城市燃氣需求的急劇增加&#xff0c;城市燃氣管網規模日趨龐大&#xff0c;安全隱患和風險也隨之增加。目前&#xff0c;我國燃氣管網的運行仍存在…

Mathematica(42)-計算N個數值的和

比如&#xff0c;我們要用Mathematica求得到下面的式子&#xff1a; 這就需要用到一個函數&#xff1a;Sum 具體地&#xff0c;Sum函數的使用形式如下&#xff1a; 因此&#xff0c;按照公式就可以得到下面的結果&#xff1a; 如果&#xff0c;我們想要將求和號也加進去&#…

Jenkins的流水線啟動jar后未執行問題處理

現象 在流水線里配置了啟動腳本例如&#xff0c;nohup java -jar xxx.jar >nohup.out 2>&1 & 但是在服務器發現服務并未啟動,且nohup日志里沒輸出日志,這樣的原因是jenkins在執行完腳本后&#xff0c;就退出了這個進程。 在啟動腳本執行jar命令的上一步加入以下…

【AIGC 訊飛星火 | 百度AI|ChatGPT| 】智能對比

AI智能對比 &#x1f378; 前言&#x1f37a; 概念類對比&#x1f375; 訊飛&#x1f375; 百度AI&#x1f375; chatGPT &#x1f379; 功能類對比? 訊飛? 百度AI? chatGPT &#x1f943; 可輸入字數對比&#x1f964; 百度AI&#x1f964; 訊飛&#x1f964; chatGPT &…

【Django】Task1安裝python環境及運行項目

【Django】Task1安裝python環境及運行項目 寫在最前 8月份Datawhale組隊學習&#xff0c;在這個群除我佬的時代&#xff0c;寫一下blog記錄學習過程。 參考資源&#xff1a; 學習項目github&#xff1a;https://github.com/Joe-2002/sweettalk-django4.2 隊長博客&#xff1a…

RocketMQ 消息消費 輪詢機制 PullRequestHoldService

1. 概述 先來看看 RocketMQ 消費過程中的輪詢機制是啥。首先需要補充一點消費相關的前置知識。 1.1 消息消費方式 RocketMQ 支持多種消費方式&#xff0c;包括 Push 模式和 Pull 模式 Pull 模式&#xff1a;用戶自己進行消息的拉取和消費進度的更新Push 模式&#xff1a;Broker…

探索心律失常:病因、診斷與治療以及與腸道菌群的關聯

谷禾健康 你是否有時會感到心悸、心慌、胸悶、氣短、頭暈、乏力&#xff1f;你是否有時感覺自己的心跳過快或過慢&#xff1f; 如果有上述情況&#xff0c;就要引起重視了&#xff0c;你可能存在心律失常。心律失常是最常見的心臟疾病之一&#xff0c;涉及到心臟的電活動節奏異…

麻辣燙數據可視化,麻辣燙市場將持續蓬勃發展

麻辣燙&#xff0c;這道源自中國的美食&#xff0c;早已成為人們生活中不可或缺的一部分。它獨特的香辣口味&#xff0c;讓人忍不住每每流連忘返。與人們的關系&#xff0c;簡直如同摯友一般。每當寒冷的冬日或疲憊的時刻&#xff0c;麻辣燙總是悄然走進人們的心房&#xff0c;…

i.MX6ULL開發板無法進入NFS掛載文件系統的解決辦法

問題 使用NFS網絡掛載文件系統后卡住無法進入系統。 解決辦法 此處不詳細講述NFS安裝流程 查看板卡掛載在/home/etc/rc.init下的自啟動程序 進入到../../home/etc目錄下&#xff0c;查看rc.init文件&#xff0c;首先從第一行排查&#xff0c;查看/home/etc/netcfg文件代碼內容&…

Flask-SQLAlchemy

認識Flask-SQLAlchemy Flask-SQLAlchemy 是一個為 Flask 應用增加 SQLAlchemy 支持的擴展。它致力于簡化在 Flask 中 SQLAlchemy 的使用。SQLAlchemy 是目前python中最強大的 ORM框架, 功能全面, 使用簡單。 ORM優缺點 優點 有語法提示, 省去自己拼寫SQL&#xff0c;保證SQL…

Python爬蟲——scrapy_crawlspider讀書網

創建crawlspider爬蟲文件&#xff1a; scrapy genspider -t crawl 爬蟲文件名 爬取的域名scrapy genspider -t crawl read https://www.dushu.com/book/1206.htmlLinkExtractor 鏈接提取器通過它&#xff0c;Spider可以知道從爬取的頁面中提取出哪些鏈接&#xff0c;提取出的鏈…

spring的核心技術---bean的生命周期加案例分析詳細易懂

目錄 一.spring管理JavaBean的初始化過程&#xff08;生命周期&#xff09; Spring Bean的生命周期&#xff1a; 二.spring的JavaBean管理中單例模式及原型&#xff08;多例&#xff09;模式 2.1 . 默認為單例&#xff0c;但是可以配置多例 2.2.舉例論證 2.2.1 默認單例 2.2…

前端常用算法(一):防抖+節流

目錄 第一章 防抖 1.1 防抖&#xff08;debounce&#xff09;簡介 1.2 應用場景 1.3 實現思路 1.4 手撕防抖代碼 第二章 節流 2.1 節流&#xff08;throttle&#xff09;簡介 2.2 應用場景 2.3 實現思路 2.4 手撕節流代碼&#xff08;方法&#xff1a;時間戳和計時器…

MR300C工業無線WiFi圖傳模塊 內窺鏡機器人圖像傳輸有線無線的兩種方式

MR300C無線WiFi圖傳模使用方法工業機器人圖像高清傳輸 ? MR300C圖傳模塊基于MIPS處理器實現&#xff0c;電腦/手機連接模塊的WIFI熱點或網口即可查看視頻流 ? 模塊的USB 2.0 Host接口&#xff0c;可接入USB uvc攝像頭/內窺鏡默認輸出的視頻格式必須是MJPG ? 模塊支持接入攝…

計算機競賽 圖像識別-人臉識別與疲勞檢測 - python opencv

文章目錄 0 前言1 課題背景2 Dlib人臉識別2.1 簡介2.2 Dlib優點2.3 相關代碼2.4 人臉數據庫2.5 人臉錄入加識別效果 3 疲勞檢測算法3.1 眼睛檢測算法3.3 點頭檢測算法 4 PyQt54.1 簡介4.2相關界面代碼 5 最后 0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是…