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

淺析Vue3中useRouter怎么在Vue組件外使用

 更新時間:2024年11月07日 11:35:33   作者:&白帝&  
useRouter?是?Vue?3?Composition?API?中的鉤子(hook),它只能在?Vue?組件中使用,本文主要來和大家探討一下如何讓他在組件外使用,感興趣的可以了解下

useRouter 是 Vue 3 Composition API 中的鉤子(hook),它只能在 Vue 組件中使用,而不是在普通的 JavaScript 模塊或工具函數(shù)中。

為了在攔截器中使用 router,你需要在 Axios 響應攔截器中獲取到 router 實例。你可以通過以下兩種方式來解決這個問題:

方案 1:將 router 作為參數(shù)傳遞到攔截器中

一種常見的解決方案是在設置 Axios 實例時,把 router 作為參數(shù)傳遞給需要使用它的地方。你可以通過 Vue 的全局狀態(tài)(比如 Vuex 或 Pinia)來存儲 router 實例,然后在攔截器中使用它。

步驟:

1.在主應用中傳遞 router:

你可以在你的 Vue 應用的主組件(比如 App.vue)中獲取 router 實例并將其存儲在 Vuex 或 Pinia 中。

2.在 Axios 中使用 router:

你可以在響應攔截器中訪問存儲的 router 實例,進而進行路由跳轉。

示例實現(xiàn):

在 store.js 或 Pinia 中存儲 router 實例:

store.js (假設你使用 Pinia 或 Vuex 來管理全局狀態(tài))

在Pinia定義一個變量用來存儲router

// 用來存儲 router 實例
  let router  =ref(null)

在 App.vue 中將 router 存入 store:

在app.vue中給Pinia定義的變量賦值

import { useRouter } from 'vue-router'
const router = useRouter()

const appStore = getAppStore()
appStore.router = router

修改 Axios 配置文件,使用存儲的 router 實例:

import axios from 'axios'
import { getAppStore } from '../store'
import { showDialog } from 'vant'
import { useRouter } from 'vue-router';
const router = useRouter()

const sender = axios.create({
  baseURL: import.meta.env.PROD ? import.meta.env.VITE_API_TARGET : 'api',
  headers: {
    'Content-Type': 'application/json'
  }
});

const appStore = getAppStore()
// const router = useRouter()
// 添加請求攔截器
// https://axios-http.com/zh/docs/interceptors
sender.interceptors.request.use(function (config) {
  // console.log('請求攔截器')
  // 統(tǒng)一添加 token 請求頭
  config.headers['Authorization'] = appStore.token
  return config;
}, function (error) {
  // console.log('請求攔截器 error: ', error)
  // 對請求錯誤做些什么
  return Promise.reject(error);
});

// 添加響應攔截器
sender.interceptors.response.use(function (response) {
  // console.log('響應攔截器', response)
  // 2xx 范圍內(nèi)的狀態(tài)碼都會觸發(fā)該函數(shù)。
  // 對響應數(shù)據(jù)做點什么
  appStore.loading = false
  if (response.headers.token) {
    appStore.token = response.headers.token
    // console.log('update token '+response.headers.token)
  }

  return response.data
}, function (error) {
  // console.log('響應攔截器 error: ', error)
  // 超出 2xx 范圍的狀態(tài)碼都會觸發(fā)該函數(shù)。
  // 對響應錯誤做點什么
  appStore.loading = false
  if (error.status === 401) {
    appStore.isLogin = false
    appStore.token = ''
    const router = appStore.router;
    router.push('/login')
  }

  if (error.status === 422) {
    showDialog({
      teleport: '#main',
      className: 'global-dialog',
      showConfirmButton: false,
      closeOnClickOverlay: true,
      message: error.response.data.message
    })
  }
  return Promise.reject(error)
});

export const send = sender

方案 2:通過 window 或 global 暴露 router

如果你不想使用全局狀態(tài)管理,也可以通過全局對象(如 window)來暫時存儲 router 實例。這樣做雖然不太推薦,但也能實現(xiàn)需求。

示例實現(xiàn):

1.在 App.vue 中將 router 暴露到 window 上:

// App.vue
import { createApp } from 'vue';
import App from './App.vue';
import { createRouter } from 'vue-router';
import { routes } from './router';

const router = createRouter({
  history: createWebHistory(),
  routes,
});

// 暴露 router 實例到 window 對象
window.appRouter = router;

const app = createApp(App);
app.use(router).mount('#app');

2.在 Axios 配置中直接使用 window.appRouter:

// axios.js
import axios from 'axios';
import { showDialog } from 'vant';

const sender = axios.create({
  baseURL: import.meta.env.PROD ? import.meta.env.VITE_API_TARGET : 'api',
  headers: {
    'Content-Type': 'application/json',
  },
});

// 添加請求攔截器
sender.interceptors.request.use(function (config) {
  // ...請求攔截邏輯
  return config;
}, function (error) {
  return Promise.reject(error);
});

// 添加響應攔截器
sender.interceptors.response.use(function (response) {
  // ...響應攔截邏輯
  return response.data;
}, function (error) {
  // 使用 window.appRouter 進行路由跳轉
  if (error.status === 422) {
    const router = window.appRouter;
    if (router) {
      router.push('/login');
      showDialog({
        teleport: '#main',
        className: 'global-dialog',
        showConfirmButton: false,
        closeOnClickOverlay: true,
        message: error.response.data.message,
      });
    }
  }

  return Promise.reject(error);
});

export const send = sender;

總結

最好的方法是通過全局狀態(tài)管理(如 Pinia 或 Vuex)來存儲 router 實例,這樣可以確保 router 的實例在任何需要使用它的地方都能正確獲取,而不必依賴 window 或全局對象。此外,避免將 router 直接暴露到全局中可以保持代碼的模塊化和清晰。

到此這篇關于淺析Vue3中useRouter怎么在Vue組件外使用的文章就介紹到這了,更多相關Vue3 useRouter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • vue.js的簡單自動求和計算實例

    vue.js的簡單自動求和計算實例

    今天小編就為大家分享一篇vue.js的簡單自動求和計算實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • Vue頁面布局與路由映射實戰(zhàn)教程之RouterView嵌套及動態(tài)組件生成詳解

    Vue頁面布局與路由映射實戰(zhàn)教程之RouterView嵌套及動態(tài)組件生成詳解

    文章介紹了布局組件在Vue應用中的設計和使用,包括布局組件的核心作用、多層RouterView的嵌套布局、靜態(tài)組件與動態(tài)組件的區(qū)別,以及動態(tài)路由的優(yōu)勢,通過這些機制,可以實現(xiàn)界面的一致性、靈活的權限控制和菜單擴展,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • 使用vue-router完成簡單導航功能【推薦】

    使用vue-router完成簡單導航功能【推薦】

    vue-router是Vue.js官方提供的一套專用的路由工具庫。這篇文章主要介紹了使用vue-router完成簡單導航功能,需要的朋友可以參考下
    2018-06-06
  • Vue.use與Vue.prototype的區(qū)別及說明

    Vue.use與Vue.prototype的區(qū)別及說明

    這篇文章主要介紹了Vue.use與Vue.prototype的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 詳解vue.js下引入百度地圖jsApi的兩種方法

    詳解vue.js下引入百度地圖jsApi的兩種方法

    這篇文章主要介紹了詳解vue.js下引入百度地圖jsApi的兩種方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • 詳解vue 計算屬性與方法跟偵聽器區(qū)別(面試考點)

    詳解vue 計算屬性與方法跟偵聽器區(qū)別(面試考點)

    這篇文章主要介紹了詳解vue 計算屬性與方法跟偵聽器區(qū)別(面試考點),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • vue3學習筆記之自定義組件舉例

    vue3學習筆記之自定義組件舉例

    這篇文章主要給大家介紹了關于vue3學習筆記之自定義組件的相關資料,組件系統(tǒng)是Vue.js其中一個重要的概念,它提供了一種抽象,讓我們可以使用獨立可復用的小組件來構建大型應用,需要的朋友可以參考下
    2023-08-08
  • vue 通過綁定事件獲取當前行的id操作

    vue 通過綁定事件獲取當前行的id操作

    這篇文章主要介紹了vue 通過綁定事件獲取當前行的id操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • vue跨域proxy代理配置詳解

    vue跨域proxy代理配置詳解

    今天被vue中proxy配置困擾了一天,記錄一下,下面這篇文章主要給大家介紹了關于Vue配置文件中的proxy配置方式的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-08-08
  • Vue3中關于getCurrentInstance的大坑及解決

    Vue3中關于getCurrentInstance的大坑及解決

    這篇文章主要介紹了Vue3中關于getCurrentInstance的大坑及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評論

图片| 曲阜市| 侯马市| 宣武区| 文登市| 溆浦县| 德清县| 绵阳市| 关岭| 茶陵县| 甘谷县| 西乌珠穆沁旗| 邛崃市| 泽州县| 汤阴县| 永寿县| 伊宁市| 怀柔区| 霍林郭勒市| 天全县| 富宁县| 龙陵县| 洛隆县| 惠水县| 西安市| 芒康县| 射洪县| 荆门市| 永新县| 甘南县| 吴桥县| 柞水县| 临高县| 滕州市| 石台县| 和林格尔县| 泰州市| 普洱| 江口县| 新乡市| 元氏县|