vue面試題:如何保存頁面的當前的狀態?

如何保存頁面的當前的狀態?

  • 既然是要保持頁面的狀態(其實也就是組件的狀態),那么會出現以下兩種情況:
    • 組件會被卸載:
      • (1)將狀態存儲在LocalStorage / SessionStorage
        • 優點:
        • 缺點:
      • (2)路由傳值
        • 優點:
        • 缺點:
    • 組件不會被卸載:
      • (1)單頁面渲染
        • 優點:
        • 缺點:
  • 用keep-alive緩存頁面

既然是要保持頁面的狀態(其實也就是組件的狀態),那么會出現以下兩種情況:

組件會被卸載:

(1)將狀態存儲在LocalStorage / SessionStorage

只需要在組件即將被銷毀的生命周期 componentWillUnmount (react)中在 LocalStorage / SessionStorage 中把當前組件的 state 通過 JSON.stringify() 儲存下來就可以了。在這里面需要注意的是組件更新狀態的時機。比如從 B 組件跳轉到 A 組件的時候,A 組件需要更新自身的狀態。但是如果從別的組件跳轉到 B 組件的時候,實際上是希望 B 組件重新渲染的,也就是不要從 Storage 中讀取信息。所以需要在 Storage 中的狀態加入一個 flag 屬性,用來控制 A 組件是否讀取 Storage 中的狀態。

優點:

兼容性好,不需要額外庫或工具。
簡單快捷,基本可以滿足大部分需求。

缺點:

狀態通過 JSON 方法儲存(相當于深拷貝),如果狀態中有特殊情況(比如 Date 對象、Regexp 對象等)的時候會得到字符串而不是原來的值。(具體參考用 JSON 深拷貝的缺點)
如果 B 組件后退或者下一頁跳轉并不是前組件,那么 flag 判斷會失效,導致從其他頁面進入 A 組件頁面時 A 組件會重新讀取 Storage,會造成很奇怪的現象

(2)路由傳值

通過 vue-router 的 Link 組件的 prop —— to 可以實現路由間傳遞參數的效果。
在這里需要用到 state 參數,在 B 組件中通過 history.location.state 就可以拿到 state 值,保存它。返回 A 組件時再次攜帶 state 達到路由狀態保持的效果。

優點:

簡單快捷,不會污染 LocalStorage / SessionStorage。
可以傳遞 Date、RegExp 等特殊對象(不用擔心 JSON.stringify / parse 的不足)

缺點:

如果 A 組件可以跳轉至多個組件,那么在每一個跳轉組件內都要寫相同的邏輯。

組件不會被卸載:

(1)單頁面渲染

要切換的組件作為子組件全屏渲染,父組件中正常儲存頁面狀態。

優點:

代碼量少
不需要考慮狀態傳遞過程中的錯誤

缺點:

增加 A 組件維護成本
需要傳入額外的 prop 到 B 組件
無法利用路由定位頁面

用keep-alive緩存頁面

除此之外,在Vue中,還可以是用keep-alive來緩存頁面,當組件在keep-alive內被切換時組件的activated、deactivated這兩個生命周期鉤子函數會被執行
被包裹在keep-alive中的組件的狀態將會被保留:

<keep-alive><router-view v-if="$route.meta.keepAlive"></router-view>
</kepp-alive>

router.js

{path: '/',name: 'xxx',component: ()=>import('../src/views/xxx.vue'),meta:{keepAlive: true // 需要被緩存}
},

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

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

相關文章

帶大家做一個,易上手的水煮牛肉

今天帶大家做川菜系中的 水煮牛肉 這個菜是比較費辣椒的 制作成本相對一般菜來說 會高一些 一塊牛肉 泡水劃冰 從超時買的干腐竹 切成小片 溫水浸泡五分鐘 泡軟它 然后撈出來 去干水分 牛肉切片 盡量切薄一點 三瓣左右蒜 一塊生姜 去皮切末 牛肉中下入 一個雞蛋 小半勺…

python實現視頻或音頻轉文本

python實現視頻或音頻轉文本 當然可以,以下是您的Python語音視頻轉文本代碼的描述: 內容概要: 這段Python代碼利用強大的語音識別庫,能夠自動將本地存儲的語音視頻文件轉換成文本。它通過分析音頻軌道中的語音數據,識別并轉錄為可編輯和可搜索的文本格式。 適用人群: …

裝修必看干貨|入戶玄關設計進門就是客廳應該怎么設計?福州中宅裝飾,福州裝修

入戶玄關設計在進門就是客廳的情況下&#xff0c;想要擁有單獨的玄關空間&#xff0c;以下是五點設計建議&#xff1a; ①隔斷屏風 使用隔斷屏風是傳統而常見的一種空間分割方法。可以選用木制、金屬或玻璃等材質的屏風&#xff0c;根據需要進行靈活搭配和定制。 屏風的款式和…

Python爬蟲——Urllib庫-1

這幾天都在為了藍橋杯做準備&#xff0c;一直在刷算法題&#xff0c;確實刷算法題的過程是及其的枯燥且枯燥的。于是我還是決定給自己找點成就感出來&#xff0c;那么Python的爬蟲就這樣開始學習了。 注&#xff1a;文章源于觀看尚硅谷爬蟲視頻后筆記 目錄 Urllib庫 基本使…

【C++】字符串 1478 - 出現次數最多的小寫字母 1475 - 字符串對比 1098 - 判斷是否構成回文 1102 - 字符串中的空格移位

文章目錄 問題一&#xff1a;1478 - 出現次數最多的小寫字母問題二&#xff1a;1475 - 字符串對比問題三&#xff1a;1098 - 判斷是否構成回文問題四&#xff1a;1102 - 字符串中的空格移位五、感謝 問題一&#xff1a;1478 - 出現次數最多的小寫字母 類型&#xff1a;字符串 …

oracle基礎體系

一、 Oracle數據庫服務器 數據庫在各個行業都會有使用到&#xff1b;其實&#xff0c;我們平時無論是在與客戶溝通或者交流中&#xff0c;所說的Oracle數據庫是指Oracle數據庫服務器&#xff08;Oracle Server&#xff09;&#xff0c;它由Oracle實例&#xff08;Oracle Instan…

什么是杠桿?WeTrade眾匯這樣舉例,大家都明白

杠桿是投資交易者一定要知道的一個金融術語。那么什么是杠桿呢?下面WeTrade眾匯就用蘋果進行舉例&#xff0c;大家就都會明白&#xff0c;原來如此簡單。 發揮我們投資者的想象&#xff0c;我們現在要進行一場蘋果的買賣&#xff0c;能夠賺錢的本質就是高買低賣&#xff0c;所…

二十篇esp3454

jfjjfj from machine import I2C,Pin from ssd1306 import SSD1306_I2C i2c I2C(sdaPin(“Y8”), sclPin(“Y6”)) oled SSD1306_I2C(128, 64, i2c, addr0x3c) oled.text(“Hello World!”, 0, 0) oled.text(“MicroPython”, 0, 20) oled.text(“By 01Studio”, 0, 50) oled…

【在巴厘島學點印尼語】日常篇

BINTANG BIR 檳棠啤酒 今天不寫代碼&#xff0c;在巴厘島休養&#xff0c;順便聊點印尼語。 印尼語&#xff0c;Bahasa Indonesia&#xff0c;是印度尼西亞的官方語言&#xff0c;也即印尼化的馬來語廖內方言&#xff0c;其變種包括 爪哇語&#xff08;島民方言&#xff09; 等…

如何選擇適合電商的WordPress主題模板?

選擇適合電商的WordPress主題模板時&#xff0c;首先應考慮主題模板是否與WooCommerce兼容。WooCommerce是WordPress中一個強大的電商插件&#xff0c;能夠幫助用戶實現在線電子商務銷售或產品展示。因此&#xff0c;選擇一個與WooCommerce高度兼容的主題模板至關重要。 其次&…

5.測試教程 - 進階篇

文章目錄 1.按測試對像劃分1.1**界面測試**1.2**可靠性測試**1.3**容錯性測試**1.4**文檔測試**1.5**兼容性測試**1.6**易用性測試**1.7**安裝卸載測試**1.8**安全測試**1.9**性能測試**1.10**內存泄漏測試** 2.按是否查看代碼劃分2.1黑盒測試(Black-box Testing)2.2白盒測試(W…

部署kubernetes-dashboard改成http免密登錄

原始鏈接地址 https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml 修改Service端口 增加80端口&#xff0c;改成http訪問 修改前: spec:ports:- port: 443targetPort: 8443selector:k8s-app: kubernetes-dashboard修改后&#xff…

snakemake: 基本語法知識點

Snakemake 使用一種基于 Python 的語法來定義工作流&#xff0c;允許用戶編寫規則&#xff08;rules&#xff09;來指定數據分析流程中的各個步驟。以下是一些基礎語法知識點&#xff0c;幫助你理解和使用 Snakemake。 1. 規則&#xff08;Rules&#xff09; 規則是 Snakemak…

【ROS源碼閱讀】

項目需要研讀ROS源碼&#xff0c;這其中碰到的一些問題記錄一下&#xff1a; 源碼編譯過程 (1) 在ubuntu 18.04 上安裝ROS melodic的版本。 (2) 下載源碼&#xff0c; ROS源碼鏈接&#xff1a; https://github.com/ros/ros_comm/tree/melodic-devel/ros_comm(3) 編譯 例如想…

圖像增強預處理對于深度學習訓練的提高有幫助嗎?

答案&#xff1a;圖像增強預處理對于深度學習訓練非常有幫助&#xff0c;它可以顯著提高模型的性能和泛化能力。 圖像增強包括許多技術&#xff0c;可以通過各種方法改進圖像數據&#xff0c;使其更適合訓練深度學習模型。 可以增加數據集的多樣性&#xff0c;減少模型對特定圖…

書生浦語全鏈路開源體系

推薦閱讀論文 A Survey Of Large Language Models 書生浦語開源的模型 從模型到應用 書生浦語開源體系 書生萬卷開源數據集 除此之外還有OpenDataLab國內數據集下載網站。 預訓練框架InterLM-Train 微調框架XTuner 評測工具體系 國內外常見的大語言模型評測基準&#xff1a…

【JS 算法題: 將 json 轉換為字符串】

題目簡介 其實就是手撕 JSON.stringfy()。 算法實現 輸入 原則上來說&#xff0c;輸入的是一個 json 對象。但需要考慮到異常情況&#xff0c;即輸入了其它類型的數據&#xff0c;比如&#xff1a;12, true, ‘abc’, [‘red’, ‘green’], null, undefined 等。 輸出 …

【比較mybatis、lazy、sqltoy、mybatis-flex、easy-query操作數據】操作批量新增、分頁查詢(三)

orm框架使用性能比較 比較mybatis、lazy、sqltoy、mybatis-flex、easy-query操作數據 環境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0測試條件常規對象 orm 框架是否支持xml是否支持 Lambda對比版本mybatis????3.5.4sqltoy????5.2.98lazy????1.2.4…

鴻蒙實戰項目開發:【短信服務】

概述 本示例展示了電話服務中發送短信的功能。 樣例展示 涉及OpenHarmony技術特性 網絡通信 難度級別 中級 基礎信息 使用ohos.telephony.sms接口展示了電話服務中發送短信的功能。 效果預覽 新建聯系人首頁短信頁 使用說明&#xff1a; 首頁點擊創建聯系人&am…

每日一練:LeeCode-203. 移除鏈表元素 【鏈表+虛擬頭結點】

每日一練&#xff1a;LeeCode-203. 移除鏈表元素 【鏈表虛擬頭結點】 思路設置虛擬頭結點 本文是力扣 每日一練&#xff1a;LeeCode-203. 移除鏈表元素 【鏈表虛擬頭結點】 學習與理解過程&#xff0c;本文僅做學習之用&#xff0c;對本題感興趣的小伙伴可以出門左拐LeeCode-20…