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

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

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

一、前置準備:確保 Vue Router 4 已安裝

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

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

基礎路由實例配置(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. 路由配置式重定向(初始化路由直接跳轉)

場景:進入某個路由時,無需組件渲染,直接自動跳轉到目標路由(如默認首頁、舊路徑兼容)。實現(xiàn)方式:在路由規(guī)則中通過 redirect 配置目標路徑 / 路由名。

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

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

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

先給目標路由設置 name,再通過 redirect: { name: '路由名' } 跳轉,適合路徑較長的場景:

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

(3)動態(tài)重定向:根據(jù)條件跳轉

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

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

2. 編程式導航重定向(組件內 / 邏輯中觸發(fā))

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

(1)基礎用法:組件內跳轉(Composition API)

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

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

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

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

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

3. 路由守衛(wèi)重定向(權限控制 / 全局攔截)

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

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

在 router/index.js 中配置,攔截所有路由跳轉,適合全局權限控制:

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

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

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

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

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

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

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

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

在組件內通過 onBeforeRouteEnter 攔截路由進入,適合組件專屬邏輯:

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

三、特殊場景重定向

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

配置通配符路由,當訪問不存在的路徑時,重定向到 404 頁面或首頁:

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

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

無論是路由配置還是編程式導航,都支持攜帶 params 或 query 參數(shù):

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

四、注意事項

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

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

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

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

Vue Router 4 語法變化

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

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

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

以上就是Vue3中頁面重定向的方式匯總的詳細內容,更多關于Vue3頁面重定向的資料請關注腳本之家其它相關文章!

相關文章

  • vue用FileSaverJs導出文件

    vue用FileSaverJs導出文件

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Vue3中監(jiān)聽ref定義的數(shù)組,需根據(jù)監(jiān)聽需求選擇合適的監(jiān)聽方法,對于空數(shù)組,推薦使用深度監(jiān)聽來捕捉數(shù)組內部變化,同時,確保修改數(shù)組的方式是響應式的,以保證監(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)的用法詳解,本文通過實例代碼的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02

最新評論

车致| 沂源县| 札达县| 阿城市| 天水市| 景泰县| 德令哈市| 东丽区| 登封市| 莫力| 上杭县| 金门县| 中阳县| 东兰县| 施秉县| 宾川县| 云梦县| 天门市| 郴州市| 邻水| 霞浦县| 涿鹿县| 九江县| 时尚| 榆社县| 赤城县| 博客| 宁国市| 芜湖县| 宜君县| 凤冈县| 太康县| 额敏县| 六枝特区| 江孜县| 安康市| 邵阳市| 贞丰县| 沧州市| 周宁县| 浠水县|