最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3中頁面重定向的方式匯總

 更新時(shí)間:2025年12月03日 09:11:39   作者:北極糊的狐  
Vue3?中頁面重定向主要依賴?Vue?Router?4,這是一個(gè)Vue3?配套的路由庫,具體分為路由配置式重定向、編程式導(dǎo)航重定向和路由守衛(wèi)重定向三類場景,以下是各種方式匯總,需要的朋友可以參考下

一、前置準(zhǔn)備:確保 Vue Router 4 已安裝

Vue3 必須使用 Vue Router 4(不兼容 Vue Router 3),如果沒有,需要先安裝依賴:

npm install vue-router@4
# 或 yarn add vue-router@4

基礎(chǔ)路由實(shí)例配置(src/router/index.js

import { createRouter, createWebHistory } from 'vue-router'
import Home from '@/views/Home.vue'
import Login from '@/views/Login.vue'
import Dashboard from '@/views/Dashboard.vue'
 
const routes = [
  // 路由配置將在這里添加
]
 
const router = createRouter({
  history: createWebHistory(import.meta.env.BASE_URL), // History 模式(推薦)
  // history: createWebHashHistory(), // Hash 模式(無需后端配置)
  routes
})
 
export default router

在 main.js 中掛載路由:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
 
createApp(App).use(router).mount('#app')

二、核心重定向方式(按場景分)

1. 路由配置式重定向(初始化路由直接跳轉(zhuǎn))

場景:進(jìn)入某個(gè)路由時(shí),無需組件渲染,直接自動(dòng)跳轉(zhuǎn)到目標(biāo)路由(如默認(rèn)首頁、舊路徑兼容)。實(shí)現(xiàn)方式:在路由規(guī)則中通過 redirect 配置目標(biāo)路徑 / 路由名。

(1)基礎(chǔ)寫法:直接指定路徑

const routes = [
  // 訪問根路徑 "/" 時(shí),重定向到 "/home"
  { path: '/', redirect: '/home' },
  // 訪問舊路徑 "/old-login" 時(shí),重定向到新路徑 "/login"(兼容舊鏈接)
  { path: '/old-login', redirect: '/login' },
  // 正常路由配置
  { path: '/home', component: Home },
  { path: '/login', component: Login }
]

(2)進(jìn)階寫法:通過路由名重定向(更靈活)

先給目標(biāo)路由設(shè)置 name,再通過 redirect: { name: '路由名' } 跳轉(zhuǎn),適合路徑較長的場景:

const routes = [
  { 
    path: '/', 
    redirect: { name: 'Home' } // 指向路由名 "Home"
  },
  { 
    path: '/home', 
    name: 'Home', // 定義路由名
    component: Home 
  },
  { 
    path: '/dashboard', 
    name: 'Dashboard', 
    component: Dashboard 
  }
]

(3)動(dòng)態(tài)重定向:根據(jù)條件跳轉(zhuǎn)

場景:根據(jù)不同參數(shù) / 狀態(tài),重定向到不同路由(如未登錄跳登錄,已登錄跳首頁)。實(shí)現(xiàn)方式redirect 接收函數(shù),返回目標(biāo)路由配置。

const routes = [
  {
    path: '/',
    // 函數(shù)參數(shù) to:當(dāng)前訪問的路由對(duì)象(含 params/query 等)
    redirect: (to) => {
      // 示例:根據(jù)本地存儲(chǔ)判斷登錄狀態(tài)
      const isLogin = localStorage.getItem('token')
      if (isLogin) {
        return { name: 'Dashboard' } // 已登錄跳控制臺(tái)
      } else {
        return '/login' // 未登錄跳登錄頁
      }
    }
  },
  { path: '/login', component: Login },
  { path: '/dashboard', component: Dashboard }
]

2. 編程式導(dǎo)航重定向(組件內(nèi) / 邏輯中觸發(fā))

場景:通過按鈕點(diǎn)擊、接口請(qǐng)求成功后等用戶交互 / 邏輯觸發(fā)跳轉(zhuǎn)(如登錄成功后跳首頁、表單提交后跳結(jié)果頁)。核心 API:通過 useRouter 鉤子獲取路由實(shí)例,調(diào)用 push 或 replace 方法。

(1)基礎(chǔ)用法:組件內(nèi)跳轉(zhuǎn)(Composition API)

<!-- Login.vue -->
<template>
  <div>
    <h1>登錄頁</h1>
    <button @click="handleLogin">登錄</button>
  </div>
</template>
 
<script setup>
import { useRouter } from 'vue-router'
const router = useRouter() // 獲取路由實(shí)例
 
const handleLogin = async () => {
  // 模擬登錄接口請(qǐng)求
  const loginSuccess = await mockLoginApi()
  
  if (loginSuccess) {
    // 方式1:跳轉(zhuǎn)到路徑(帶 query 參數(shù))
    router.push('/dashboard?tab=1')
    
    // 方式2:跳轉(zhuǎn)到路由名(帶 params 參數(shù),需路由配置占位符)
    // router.push({ name: 'Dashboard', params: { id: 1 }, query: { tab: 1 } })
    
    // 方式3:replace 跳轉(zhuǎn)(不添加歷史記錄,無法回退到當(dāng)前頁)
    // router.replace('/dashboard')
  }
}
 
// 模擬登錄接口
const mockLoginApi = () => Promise.resolve(true)
</script>

(2)選項(xiàng)式 API 兼容寫法(適用于舊項(xiàng)目遷移)

<script>
export default {
  methods: {
    handleLogin() {
      this.$router.push('/dashboard') // 等同于 setup 中的 router.push
    }
  }
}
</script>

(3)關(guān)鍵區(qū)別:push vs replace

方法行為描述適用場景
router.push(path)添加新歷史記錄,可通過「回退」返回上一頁正常跳轉(zhuǎn)(如列表頁→詳情頁)
router.replace(path)替換當(dāng)前歷史記錄,無法回退到當(dāng)前頁登錄頁、重定向頁(避免回退到登錄頁)

3. 路由守衛(wèi)重定向(權(quán)限控制 / 全局?jǐn)r截)

場景:全局?jǐn)r截所有路由跳轉(zhuǎn),根據(jù)條件重定向(如未登錄攔截、角色權(quán)限控制、頁面訪問限制)。核心 API:Vue Router 4 的全局守衛(wèi)(router.beforeEach)、路由獨(dú)享守衛(wèi)、組件內(nèi)守衛(wèi)。

(1)全局守衛(wèi):router.beforeEach(最常用)

在 router/index.js 中配置,攔截所有路由跳轉(zhuǎn),適合全局權(quán)限控制:

// router/index.js
router.beforeEach((to, from, next) => {
  // to:即將跳轉(zhuǎn)的目標(biāo)路由
  // from:當(dāng)前離開的路由
  // next:Vue Router 3 寫法(Vue Router 4 可直接 return 路由對(duì)象,無需 next)
  
  const token = localStorage.getItem('token') // 獲取登錄態(tài)
  const whiteList = ['/login', '/register'] // 白名單(無需登錄可訪問)
  
  // 邏輯:未登錄且目標(biāo)路由不在白名單 → 重定向到登錄頁
  if (!token && !whiteList.includes(to.path)) {
    // Vue Router 4 推薦寫法:直接 return 目標(biāo)路由
    return { path: '/login', query: { redirect: to.path } } 
    // 攜帶 redirect 參數(shù),登錄成功后可跳回原目標(biāo)頁(見下文示例)
  }
  
  // 允許跳轉(zhuǎn)(Vue Router 4 中可省略,默認(rèn)放行)
  return true
})

(2)登錄成功后跳回原目標(biāo)頁(基于 redirect 參數(shù))

在登錄頁處理 redirect 參數(shù),實(shí)現(xiàn)「攔截后跳轉(zhuǎn)回原頁面」:

<!-- Login.vue -->
<script setup>
import { useRouter, useRoute } from 'vue-router'
const router = useRouter()
const route = useRoute() // 獲取當(dāng)前路由參數(shù)
 
const handleLogin = async () => {
  const loginSuccess = await mockLoginApi()
  if (loginSuccess) {
    // 獲取 redirect 參數(shù)(若有則跳回原頁面,無則跳首頁)
    const redirectPath = route.query.redirect || '/dashboard'
    router.push(redirectPath)
  }
}
</script>

(3)路由獨(dú)享守衛(wèi)(單個(gè)路由攔截)

在特定路由規(guī)則中配置 beforeEnter,僅攔截當(dāng)前路由:

const routes = [
  {
    path: '/dashboard',
    component: Dashboard,
    // 路由獨(dú)享守衛(wèi):僅訪問該路由時(shí)觸發(fā)
    beforeEnter: (to, from) => {
      const token = localStorage.getItem('token')
      if (!token) {
        return '/login' // 未登錄 → 重定向到登錄頁
      }
    }
  }
]

(4)組件內(nèi)守衛(wèi)(組件級(jí)攔截)

在組件內(nèi)通過 onBeforeRouteEnter 攔截路由進(jìn)入,適合組件專屬邏輯:

<!-- Dashboard.vue -->
<script setup>
import { onBeforeRouteEnter } from 'vue-router'
import { ElMessage } from 'element-plus' // 示例:UI 組件提示
 
// 組件內(nèi)守衛(wèi):進(jìn)入該組件前觸發(fā)
onBeforeRouteEnter((to, from) => {
  const role = localStorage.getItem('role') // 獲取用戶角色
  // 邏輯:僅管理員可訪問,普通用戶重定向到首頁
  if (role !== 'admin') {
    ElMessage.warning('無權(quán)限訪問,已跳轉(zhuǎn)首頁')
    return '/' // 重定向到首頁
  }
})
</script>

三、特殊場景重定向

1. 404 頁面重定向(路由未匹配時(shí))

配置通配符路由,當(dāng)訪問不存在的路徑時(shí),重定向到 404 頁面或首頁:

const routes = [
  // 其他路由...
  { path: '/404', component: () => import('@/views/404.vue') },
  // 通配符路由(必須放在最后):匹配所有未定義的路由
  { path: '/:pathMatch(.*)*', redirect: '/404' } 
  // 或直接重定向到首頁:{ path: '/:pathMatch(.*)*', redirect: '/' }
]

2. 帶參數(shù)的重定向

無論是路由配置還是編程式導(dǎo)航,都支持?jǐn)y帶 params 或 query 參數(shù):

// 1. 路由配置中帶參數(shù)
{ path: '/old-user', redirect: { name: 'User', params: { id: 1 }, query: { type: 'old' } } }
 
// 2. 編程式導(dǎo)航帶參數(shù)
router.push({ 
  name: 'User', 
  params: { id: 1 }, // 路徑參數(shù)(需路由配置占位符:/user/:id)
  query: { type: 'old' } // 查詢參數(shù)(拼接在路徑后:?type=old)
})

四、注意事項(xiàng)

History 模式需后端配置:若使用 createWebHistory(History 模式),后端需配置所有路由指向 index.html(避免刷新 404),Nginx 示例配置:

location / {
  try_files $uri $uri/ /index.html;
}

若無需后端配置,可改用 createWebHashHistory(Hash 模式,路徑含 #)。

避免無限重定向:重定向目標(biāo)路由不能再次指向自身(如 /a 重定向到 /b,/b 又重定向到 /a),會(huì)導(dǎo)致瀏覽器崩潰,需通過白名單、條件判斷規(guī)避。

Vue Router 4 語法變化

  • 不再支持 this.$router 在 setup 中使用,需通過 useRouter 鉤子獲取。
  • 路由守衛(wèi)中無需 next(),直接 return 路由對(duì)象 或 return true 放行。

五、匯總不同場景選擇建議

場景推薦重定向方式
初始化路由自動(dòng)跳轉(zhuǎn)(如根路徑)路由配置式重定向(redirect
組件內(nèi)交互觸發(fā)(如按鈕點(diǎn)擊)編程式導(dǎo)航(router.push/replace
全局權(quán)限控制(如未登錄攔截)全局守衛(wèi)(router.beforeEach
單個(gè)路由攔截(如管理員路由)路由獨(dú)享守衛(wèi)(beforeEnter
舊路徑兼容、404 頁面路由配置式重定向(通配符 / 固定路徑)

以上就是Vue3中頁面重定向的方式匯總的詳細(xì)內(nèi)容,更多關(guān)于Vue3頁面重定向的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue用FileSaverJs導(dǎo)出文件

    vue用FileSaverJs導(dǎo)出文件

    FileSaver.js?是在客戶端保存文件的解決方案,非常適合?在客戶端上生成文件的?Web?應(yīng)用,它是?HTML5?版本的?saveAs()?FileSaver?實(shí)現(xiàn),這篇文章主要介紹了vue用FileSaverJs導(dǎo)出文件,需要的朋友可以參考下
    2023-09-09
  • 如何在在Vue3中使用markdown 編輯器組件

    如何在在Vue3中使用markdown 編輯器組件

    vue3發(fā)布正式版不久,生態(tài)還沒完全發(fā)展起來,目前支持vue3的開源markdown編輯器組件基本上也寥寥無幾,向大家推薦一個(gè)很好用的v-md-editor 組件,組件功能很強(qiáng)大,文檔也比較詳細(xì)。該文章只介紹組件的常用功能,更多高級(jí)的功能可以參考官方文檔。
    2021-05-05
  • vue3?setup語法糖之組件傳參(defineProps、defineEmits、defineExpose)示例詳解

    vue3?setup語法糖之組件傳參(defineProps、defineEmits、defineExpose)示例詳

    defineProps?和?defineEmits?都是只能在?<script?setup>?中使用的編譯器宏,他們不需要導(dǎo)入,且會(huì)隨著?<script?setup>?的處理過程一同被編譯掉,這篇文章主要介紹了vue3?setup語法糖之組件傳參(defineProps、defineEmits、defineExpose)示例詳解,需要的朋友可以參考下
    2023-01-01
  • Vue中使用Lodop插件實(shí)現(xiàn)打印功能的簡單方法

    Vue中使用Lodop插件實(shí)現(xiàn)打印功能的簡單方法

    這篇文章主要給大家介紹了關(guān)于Vue中使用Lodop插件實(shí)現(xiàn)打印功能的簡單方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • vue3.0 CLI - 1 - npm 安裝與初始化的入門教程

    vue3.0 CLI - 1 - npm 安裝與初始化的入門教程

    這篇文章主要介紹了vue3.0 CLI - 1 - npm 安裝與初始化的入門教程,本文通過實(shí)例代碼相結(jié)合的形式,給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • vue 通過base64實(shí)現(xiàn)圖片下載功能

    vue 通過base64實(shí)現(xiàn)圖片下載功能

    這篇文章主要介紹了vue 通過base64實(shí)現(xiàn)圖片下載功能,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-12-12
  • vue 圖片裁剪上傳組件的實(shí)現(xiàn)

    vue 圖片裁剪上傳組件的實(shí)現(xiàn)

    這篇文章主要介紹了vue 圖片裁剪上傳組件的實(shí)現(xiàn),幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-11-11
  • Vue3項(xiàng)目中通過LuckySheet實(shí)現(xiàn)Excel在線編輯功能

    Vue3項(xiàng)目中通過LuckySheet實(shí)現(xiàn)Excel在線編輯功能

    在實(shí)現(xiàn)Excel文件導(dǎo)入時(shí),領(lǐng)導(dǎo)要求實(shí)現(xiàn)在前端導(dǎo)入文件后,不調(diào)用后端的接口,而是直接顯示excel文件的內(nèi)容,等待用戶修改完以后,再調(diào)用后端接口進(jìn)行文件的提交,所以本文介紹了Vue3項(xiàng)目中通過LuckySheet實(shí)現(xiàn)Excel在線編輯,需要的朋友可以參考下
    2025-04-04
  • Vue3中ref數(shù)組的監(jiān)聽實(shí)現(xiàn)方式

    Vue3中ref數(shù)組的監(jiān)聽實(shí)現(xiàn)方式

    Vue3中監(jiān)聽ref定義的數(shù)組,需根據(jù)監(jiān)聽需求選擇合適的監(jiān)聽方法,對(duì)于空數(shù)組,推薦使用深度監(jiān)聽來捕捉數(shù)組內(nèi)部變化,同時(shí),確保修改數(shù)組的方式是響應(yīng)式的,以保證監(jiān)聽器能正常工作,根據(jù)具體需求,可以選擇直接深度監(jiān)聽、監(jiān)聽數(shù)組長度變化或提取屬性監(jiān)聽等方案
    2025-10-10
  • vue中 v-for循環(huán)的用法詳解

    vue中 v-for循環(huán)的用法詳解

    這篇文章主要介紹了vue中 v-for循環(huán)的用法詳解,本文通過實(shí)例代碼的形式給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

买车| 淳化县| 巴彦县| 综艺| 闸北区| 淄博市| 宜城市| 株洲市| 瑞金市| 鄯善县| 昌图县| 三河市| 太保市| 临洮县| 平乐县| 葫芦岛市| 通化县| 新干县| 勃利县| 定州市| 资兴市| 星座| 来宾市| 奉新县| 宝鸡市| 始兴县| 门源| 琼海市| 张家川| 珠海市| 莎车县| 中牟县| 荣昌县| 营口市| 淄博市| 武宣县| 屏东市| 嵊泗县| 盐边县| 南京市| 东乡县|