Vue中路由緩存問題及解決方法

一.問題

Vue Router 允許你在你的應用中創建多個視圖,并根據路由來動態切換這些視圖。默認情況下,當你從一個路由切換到另一個路由時,Vue Router 會銷毀前一個路由的組件實例并創建新的組件實例。然而,有時候你可能希望保持一些頁面的狀態,以便用戶在后續訪問時不必重新加載數據或重新初始化頁面。

這就引入了路由緩存的概念。路由緩存允許你在切換路由時保留組件的狀態,以便在后續訪問時能夠快速恢復。這在一些場景下非常有用,比如用戶在切換頁面后仍然保留表單輸入、滾動位置等。

然而,路由緩存也可能引發一些問題:

  1. 內存消耗: 緩存頁面組件可能會導致內存占用增加,特別是如果應用有很多頁面。

  2. 數據過時: 如果緩存的頁面狀態不及時更新,用戶可能會看到過時的數據。

  3. 交互問題: 頁面狀態被保留可能導致一些交互問題,比如在某個路由上打開了一個彈出窗口,在切換路由后回來,彈出窗口可能仍然顯示。

  4. 生命周期問題: 緩存的組件實例可能不會像重新創建的實例那樣觸發生命周期鉤子,這可能會影響一些功能的正常運行。

二.方法?

1.<keep-alive> 組件

你可以將要緩存的頁面組件包裹在 <keep-alive> 組件中,以實現緩存效果。這個組件提供了一些屬性和鉤子函數,用于自定義緩存行為。

假設有兩個頁面組件:Home.vueAbout.vue,希望在切換頁面時保留 Home 組件的狀態。可以這樣使用 <keep-alive>

<template><div><router-link to="/home">Home</router-link><router-link to="/about">About</router-link><keep-alive><router-view></router-view></keep-alive></div>
</template>

<keep-alive> 將會緩存 <router-view> 內的組件,也就是當前活動的路由組件。當從 Home 切換到 About 并再次回到 Home 時,Home 組件的狀態將被保留,不會重新創建實例。

注意,使用 <keep-alive> 緩存組件時,可能需要處理一些特定的生命周期鉤子。當組件被緩存時,它不會再觸發 createdmounted 生命周期鉤子,而是觸發 activateddeactivated 鉤子。這就意味著需要在這兩個鉤子函數中處理恢復狀態和暫停狀態的邏輯。

activated() {// 從緩存中恢復時觸發console.log('Home component activated');},deactivated() {// 離開緩存時觸發console.log('Home component deactivated');},

2.meta 字段

可以在路由配置中使用 meta 字段來控制是否緩存特定的頁面。

// router.js
import Vue from 'vue';
import VueRouter from 'vue-router';
import Home from './views/Home.vue';
import About from './views/About.vue';Vue.use(VueRouter);const routes = [{path: '/home',component: Home,meta: { keepAlive: true } // 緩存 Home 組件},{path: '/about',component: About// About 組件不會被緩存}
];const router = new VueRouter({routes
});export default router;

meta 字段被用于控制緩存行為。keepAlive 是一個自定義的字段,你可以根據需要設置為 truefalse 來決定是否緩存該路由對應的組件。在 Home.vue 組件中,你可以使用 activateddeactivated 鉤子來處理緩存狀態

<template><div><h1>Home Page</h1><p>Count: {{ count }}</p></div>
</template><script>
export default {name: 'Home',data() {return {count: 0};},activated() {console.log('Home component activated');},deactivated() {console.log('Home component deactivated');},methods: {increment() {this.count++;}}
};
</script>

Home 組件使用了 activateddeactivated 鉤子來處理恢復狀態和暫停狀態的邏輯。當用戶切換到 /home 路由時,Home 組件會從緩存中恢復,并觸發 activated 鉤子。當用戶離開 /home 路由時,Home 組件會被緩存,并觸發 deactivated 鉤子。

3.路由鉤子函數

路由鉤子函數是在 Vue Router 中用于控制路由導航和組件生命周期的一組函數。它們允許你在路由導航發生之前或之后執行特定的邏輯

  1. beforeEach(to, from, next): 這個鉤子函數會在每次路由切換之前被調用。可以用來進行權限驗證、全局攔截等操作。你可以在 next() 中傳遞一個新的路由路徑,以改變路由導航的目標。

  2. beforeResolve(to, from, next): 這個鉤子函數在導航被確認之前被調用。它類似于 beforeEach,但在異步組件被解析后觸發。適用于需要等待異步組件解析完成后再執行的情況。

  3. afterEach(to, from): 在每次路由切換成功完成后被調用。通常用于日志記錄或頁面追蹤等操作。

  4. beforeRouteEnter(to, from, next): 這個鉤子函數在路由即將被進入之前被調用。它不會擁有訪問組件實例的權限,但可以通過回調函數中的 next 參數傳遞一個回調來訪問組件實例。

  5. beforeRouteUpdate(to, from, next): 在當前路由改變,但是該組件被復用時調用。例如,在 /user/1/user/2 的導航中,如果使用了相同的組件實例,這個鉤子函數將會被觸發。

  6. beforeRouteLeave(to, from, next): 在離開當前路由前被調用。可以用于詢問用戶是否確認離開當前頁面,或執行一些數據保存操作。

?舉個例子,你可以使用 beforeEach 鉤子來進行權限驗證,使用 beforeRouteEnter 鉤子來從后端加載數據,使用 beforeRouteLeave 鉤子來在用戶離開頁面前進行數據保存等操作。

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

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

相關文章

【推薦】深入淺出學習Spring框架【中】

目錄 1.AOP是什么? 2.案列&#xff1a; 3.spring的aop的專業術語 4.代碼模擬 4.1 前置通知 3.2.后置通知 3.3.環繞通知 3.4.異常通知 3.5.過濾通知 1.AOP是什么? 面向切面編程&#xff08;Aspect-Oriented Programming&#xff09;是一種編程范式&#xff0c;它的主要…

第十四屆中國大學生服務外包大賽細品,上百支隊伍與合合信息用AI共克“記賬”難題

前言 熟悉我的小伙伴應該知道我在大學時期參與了很多競賽&#xff0c;我向來對比賽是比較熱枕的&#xff0c;以我個人觀點&#xff0c;我認為可以通過競賽激發學習激情和檢驗自己的技能水平掌握情況&#xff0c;大學生很少有機會能夠了解到課堂之外市場的需求&#xff0c;外包…

P1123 取數游戲

取數游戲 題目描述 一個 N M N\times M NM 的由非負整數構成的數字矩陣&#xff0c;你需要在其中取出若干個數字&#xff0c;使得取出的任意兩個數字不相鄰&#xff08;若一個數字在另外一個數字相鄰 8 8 8 個格子中的一個即認為這兩個數字相鄰&#xff09;&#xff0c;求…

JWT(JSON Web Token )令牌

1、介紹 jwt就是將原始的json數據格式進行了安全的封裝&#xff0c;這樣就可以直接基于jwt在通信雙方安全的進行信息傳輸了。 2、jwt組成 第一部分&#xff1a;Header(頭&#xff09;&#xff0c; 記錄令牌類型、簽名算法等。 例如&#xff1a;{"alg":"HS256…

EXCEL按列查找,最終返回該列所需查詢序列所對應的值,VLOOKUP函數

EXCEL按列查找&#xff0c;最終返回該列所需查詢序列所對應的值 示例&#xff1a;國標行業分類漢字&#xff0c;匹配id 使用VLOOKUP函數 第一參數&#xff1a;拿去查詢的值。 第二參數&#xff1a;匹配的數據。 Ps&#xff1a;Sheet1!$C 21 : 21: 21:E 117 &#xff0c;需要…

Redis系列(三):深入解讀Redis主從同步機制

首發博客地址 https://blog.zysicyj.top/ Redis高可靠靠什么保證&#xff1f; 為什么要提這個呢&#xff0c;因為Redis主從庫目的呢其實就是為了實現高可靠。上篇文章中我們說過Redis的AOF、RDB日志其實就是為了減少數據丟失&#xff0c;這是高可靠的一部分。 這篇文章呢&#…

Lua 位和字節

一、位運算 從 Lua 5.3 版本開始&#xff0c;提供了針對數值類型的一組標準位運算符&#xff0c;與算數運算符不同的是&#xff0c;運算符只能用于整型數。 運算符描述&按位與|按位或&#xff5e;按位異或>>邏輯右移<<邏輯左移&#xff5e;&#xff08;一元運…

Git 如何使用TortoiseGit 操作本地倉庫

初始化倉庫 方法一: 新建一個文件夾,進入文件夾內部操作 1、右鍵--> 在這里創建Git 版本庫 注意: 不要直接在桌面上操作,否則桌面就是一個倉庫 方法二: 1、右鍵-->Git GUI here 方法三: 命令行模式 1、 git init 創建完畢倉庫,我們發現,此時我們創建的文件夾下…

leetcode做題筆記83刪除排序鏈表中的重復元素

給定一個已排序的鏈表的頭 head &#xff0c; 刪除所有重復的元素&#xff0c;使每個元素只出現一次 。返回 已排序的鏈表 。 輸入&#xff1a;head [1,1,2] 輸出&#xff1a;[1,2] 思路一&#xff1a;模擬題意 struct ListNode* deleteDuplicates(struct ListNode* head){i…

FreeRTOS qemu mps2-an385 bsp 移植制作 :系統運行篇

相關文章 FreeRTOS qemu mps2-an385 bsp 移植制作 &#xff1a;環境搭建篇 FreeRTOS qemu mps2-an385 bsp 移植制作 &#xff1a;系統啟動篇 開發環境 Win10 64位 VS Code&#xff0c;ssh 遠程連接 ubuntu VMware Workstation Pro 16 Ubuntu 20.04 FreeRTOSv202212.01&a…

React 全棧體系(二)

第二章 React面向組件編程 一、基本理解和使用 1. 使用React開發者工具調試 2. 效果 2.1 函數式組件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>1_函數式組件</title> </head> &l…

計算機競賽 python 爬蟲與協同過濾的新聞推薦系統

1 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; python 爬蟲與協同過濾的新聞推薦系統 &#x1f947;學長這里給一個題目綜合評分(每項滿分5分) 難度系數&#xff1a;3分工作量&#xff1a;3分創新點&#xff1a;4分 該項目較為新穎&…

軟件壓力測試對軟件產品起到什么作用?

一、軟件壓力測試是什么? 軟件壓力測試是一種通過模擬正常使用環境中可能出現的大量用戶和大數據量的情況&#xff0c;來評估軟件系統在壓力下的穩定性和性能表現的測試方法。在軟件開發過程中&#xff0c;經常會遇到一些性能瓶頸和穩定性問題&#xff0c;而軟件壓力測試的作…

react-codemirror2 編輯器需點擊一下或者延時才顯示數據的問題

現象&#xff1a; <Codemirror/>組件的數據已經賦上值的情況下&#xff0c;初始狀態不渲染數據&#xff0c;需要點擊編輯框獲取焦點后才展示&#xff0c;或者延遲了幾秒才顯示出來。 原因&#xff1a; 指定了一些依賴的版本&#xff0c;可能不兼容了一些功能&#xff0c…

C# int ? 關鍵字使用方法

使用C#的時間也不算短。 但是今天看到了一個從來沒有見過的寫法 Int &#xff1f;這是個什么寫法&#xff0c;沒見過啊&#xff0c;百度了查一下&#xff0c;也在這里記錄一下。 1、int? 關鍵字說明 (1)、int? 表示一個int類型,且該int類型可空,如果不加?的話,那么int類…

C語言刷題指南(一)

&#x1f4d9;作者簡介&#xff1a; 清水加冰&#xff0c;目前大二在讀&#xff0c;正在學習C/C、Python、操作系統、數據庫等。 &#x1f4d8;相關專欄&#xff1a;C語言初階、C語言進階、數據結構刷題訓練營、有感興趣的可以看一看。 歡迎點贊 &#x1f44d; 收藏 ?留言 &am…

認識excel篇3之數據的有效性(數據驗證)

數據有效性不僅能夠對單元格的輸入數據進行條件限制&#xff0c;還可以在單元格中創建下拉列表菜單方便用戶選擇輸入。如果沒有做數據驗證&#xff0c;單元格內默認可以輸入任意類型的數據。數據驗證就是限制單元格輸入數據&#xff08;必須輸入符合要求的才能輸入&#xff09;…

VS2022如何查看類成員都在哪里被調用了(VS如何打開Call Hierarchy視圖)

文章目錄 打開Call Hierarchy視圖查看成員的調用 打開Call Hierarchy視圖 單擊菜單欄的“視圖” > “調用層次結構”&#xff0c;即可打卡Call Hierarchy視圖。 查看成員的調用 在代碼編輯窗口&#xff0c;右鍵單擊想要查看的類成員&#xff0c;然后選擇“查看調用層次結…

機器學習算法之-邏輯回歸(2)

為什么需要邏輯回歸 擬合效果太好 特征與標簽之間的線性關系極強的數據&#xff0c;比如金融領域中的 信用卡欺詐&#xff0c;評分卡制作&#xff0c;電商中的營銷預測等等相關的數據&#xff0c;都是邏輯回歸的強項。雖然現在有了梯度提升樹GDBT&#xff0c;比邏輯回歸效果更…

一、數學建模之線性規劃篇

1.定義 2.例題 3.使用軟件及解題 一、定義 1.線性規劃&#xff08;Linear Programming&#xff0c;簡稱LP&#xff09;是一種數學優化技術&#xff0c;線性規劃作為運籌學的一個重要分支&#xff0c;專門研究在給定一組線性約束條件下&#xff0c;如何找到一個最優的決策&…