解決VUE頁面刷新,數據丟失「建議收藏」

2020-12-23 網視界

在vue項目中有時候會遇到一個問題,就是進行頁面刷新的時候,導致頁面的數據丟失,出現這個問題的原因是因為當用vuex做全局狀態管理的時候,store中的數據是保存在運行內存中的,頁面刷新時會重新加載vue實例,store中的數據就會被重新賦值,因此數據就丟失了,解決方式如下:

方法一:

最先想到的應該就是利用localStorage/sessionStorage將數據儲存在外部,做一個持久化儲存,下面是利用localStorage存儲的具體方案:

方案一:由於state中的數據是響應式的,而數據又是通過mutation來進行修改,故在通過mutation修改state中數據的同時調用localStorage.setItem()方法來進行數據的存儲。

import Vue from 'vue';import Vuex from 'vuex';Vue.use(Vuex);export default new Vuex.Store({state: {orderList: [],menuList: []},mutations: {orderList(s, d) {s.orderList= d;window.localStorage.setItem("list",jsON.stringify(s.orderList))},menuList(s, d) {s.menuList = d;window.localStorage.setItem("list",jsON.stringify(s.menuList))},}})

在頁面加載的時候再通過localStorage.getItem()將數據取出放回到vuex,可在app.vue的created()周期函數中寫如下代碼:

if (window.localStorage.getItem("list") ) {this.$store.replaceState(Object.assign({},this.$store.state,JSON.parse(window.localStorage.getItem("list"))))}

方案二:方案一能夠順利解決問題,但不斷觸發localStorage.setItem()方法對性能不是特別友好,而且一直將數據同步到localStorage中似乎就沒必要再用vuex做狀態管理,直接用localStorage即可,於是對以上解決方法進行了改進,通過監聽beforeunload事件來進行數據的localStorage存儲,beforeunload事件在頁面刷新時進行觸發,具體做法是在App.vue的created()周期函數中下如下代碼:

this.$store.replaceState(Object.assign({}, this.$store.state,JSON.parse(window.localStorage.getItem("list"))))window.addEventListener("beforeunload",()=>{window.localStorage.setItem("list",JSON.stringify(this.$store.state))})

方法二[特別推薦]:

此方法基於對computed計算屬性的理解,計算屬性是基於他們的響應式依賴進行緩存的

由此得出計算屬性的結果會被緩存,也就是說在有緩存的情況下,computed會優先使用緩存,也可以在state數據相對應的頁面這樣寫:

computed:{orderList() {return this.$store.state.orderList}}

相關焦點

  • Vue 項目中哪些問題戳中你的痛點?你又是如何解決的?(更新中)
    最近要求使用vue進行前後端分離開發微信公眾號,不斷摸索踩坑之後,總結出如下幾點vue項目開發中常見的問題及解決辦法。如果你是vue大佬,請忽略小弟的愚見^V^列表進入詳情頁的傳參問題。,也是可以傳過去的,同時也能接收到,但是一旦刷新頁面,這個參數就不存在了。
  • Vue面試題(3)Vue-Router和Vuex
    、可以很好的使用vue開發者工具調試vuex的狀態 。這些優勢是localStorage不能夠很好的模擬的。4、頁面刷新後vuex的state數據丟失怎麼解決?store裡的數據是保存在運行內存中的,當頁面刷新時,頁面會重新加載vue實例,store裡面的數據就會被重新賦值初始化。
  • 30 道 Vue 面試題,內含詳細講解
    本文章節結構以從易到難進行組織,建議讀者按章節順序進行閱讀,當然大佬級別的請隨意。希望讀者讀完本文,有一定的啟發思考,也能對自己的 Vue 掌握程度有一定的認識,對缺漏之處進行彌補,對 Vue 有更好的掌握。文章最後一題,歡迎同學們積極回答,分享各自的經驗 ~~~1、說說你對 SPA 單頁面的理解,它的優缺點分別是什麼?
  • 【Vue.js入門到實戰教程】11-Vue Loader(下)| 編寫一個單文件 Vue 組件
    /App.vue'import 'bootstrap'import 'bootstrap/dist/css/bootstrap.min.css'...接下來,就可以正式編寫單文件組件了。編寫 ModalExample 組件我們將 vue_learning/component/slot.html 中的 modal-example 組件拆分出來,在 vue_learning/demo-project/src/components 目錄下新建一個單文件組件 ModalExample.vue,將 modal-example 組件代碼按照 Vue Loader 指定的格式填充到對應位置
  • Vue Loader 篇(下):編寫一個單文件 Vue 組件
    /App.vue'import 'bootstrap'import 'bootstrap/dist/css/bootstrap.min.css'...接下來,就可以正式編寫單文件組件了。編寫 ModalExample 組件我們將 vue_learning/component/slot.html 中的 modal-example 組件拆分出來,在 vue_learning/demo-project/src/components 目錄下新建一個單文件組件 ModalExample.vue,將 modal-example 組件代碼按照 Vue Loader 指定的格式填充到對應位置
  • 「Web全棧教程」手把手教你用 Vue.js + Django 搭建在線教育平臺
    比如,「實驗樓」就在年初接到了國內部分高校的計算機開課請求,讓學校們可以使用實驗樓的在線環境進行教學工作。那麼, 實驗樓」這樣的在線編程教育網站是如何搭建的呢?今天給大家分享一個 Web 全棧項目: 以「實驗樓」為例,用 Vue.js 和 Django 搭建一個在線教育網站!
  • Vue對象屬性改變,視圖卻不刷新問題解決
    由於對Vue的學習還停留在會用的階段,並沒有太深入的研究,所以,在解決這個問題時,走了一些彎路,現將在解決問題中走的彎路也了並記錄下來,以備後查。在FileList中添加一個屬性FileList是一個文件列表。
  • 你不可不知的前端進階知識:Vue事件總線(EventBus)使用詳細介紹
    vue組件非常常見的有父子組件通信,兄弟組件通信。而父子組件通信就很簡單,父組件會通過props向下傳數據給子組件,當子組件有事情要告訴父組件時會通過 $emit事件告訴父組件。今天就來說說如果兩個頁面沒有任何引入和被引入關係,該如何通信了?
  • 「Vue.js開發連載一」Vue.js簡介
    一、簡介Vue.js(讀音 /vju/,類似於view)是一個構建數據驅動的web界面的漸進式框架。Vue。js的目標是通過儘可能簡單的API實現響應的數據綁定和組合的視圖組件。它不僅易於上手,還便於與第三方庫或既有項目整合。
  • Vue-router-link跳轉頁面時不在頂部問題解決
    我們在使用vue router-link組件進行頁面跳轉時,會出現當前頁面在什麼位置,跳轉頁面也在什麼位置這樣如果當前頁面過長,跳轉的效果就不是很好如何解決這一問題呢?只需要在router文件夾下的index.js文件中添加一段代碼即可如下圖所示,添加如下代碼,就完美解決這個問題了!
  • 20 道必看的 Vue 面試題 | 原力計劃
    beforeCreate:Vue 實例的掛載元素 $el 和數據對象 data 都為未定義,還未初始化。created:vue 實例的數據對象 data 有值了,$el 沒有。beforeMount:vue 實例的 $el 和 data 都初始化了,但還是虛擬的 dom 節點,具體的 data.filter 還未替換掉。
  • 「強烈建議收藏」小程序canvas繪製帶二維碼海報全流程(枚舉踩坑,詳解解決方案)
    接下來,我會把純前端實現生成帶二維碼的海報全流程給大家講個明明白白,把我自己遇到的坑,給大家詳細分享並講解,防止大家遇到相似問題,即使遇到問題,也會有一個明確的方向,並且吐血建議大家收藏一波
  • 即時通訊工具 V-IM 0.5.0 發布,主要解決網頁模式刷新頁面狀態丟失...
    V-IM 即時通訊工具,V-0.5.0 發布,主要解決網頁模式刷新頁面狀態丟失問題。
  • 20 道必看的 Vue 面試題|原力計劃
    beforeCreate:Vue 實例的掛載元素 $el 和數據對象 data 都為未定義,還未初始化。created:vue 實例的數據對象 data 有值了,$el 沒有。src文件夾 :工程項目的源碼以及資源、包括頁面圖片、路由組件、路由配置、vuex、入口文件等。其他文件:定義的一些項目信息,說明等等。12. vue-router 路由的兩種模式。
  • 前端VUE知識點鞏固
    一個vue的生命周期執行順序,邏輯,執行次數vue每個組件都是獨立的,每個組件都有一個屬於它的生命周期
  • Vue 項目數據動態過濾實踐
    -),過程中會涉及到一些Vue源碼的概念比如$mount、render watcher等,如果不太了解的話可以瞅瞅 Vue源碼閱讀系列文章 ~問題是這樣的:頁面從後臺拿到的數據是由0、1之類的key,而這個key代表的value比如0-女、1-男的對應關係是要從另外一個數據字典接口拿到的;類似於這樣的Api:{  "SEX_TYPE": [
  • vue題
    實例已完成以下的配置:編譯模板,把data裡面的數據和模板生成html。注意此時還沒有掛載html到頁面上。mounted(載入後) 在el 被新創建的 vm.$el 替換,並掛載到實例上去之後調用。實例已完成以下的配置:用上面編譯好的html內容替換el屬性指向的DOM對象。完成模板中的html渲染到html頁面中。此過程中進行ajax交互。
  • 從頭開始學習 vue-router
    vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,適合用於構建單頁面應用。vue的單頁面應用是基於路由和組件的,路由用於設定訪問路徑,並將路徑和組件映射起來。傳統的頁面應用,是用一些超連結來實現頁面切換和跳轉的。在vue-router單頁面應用中,則是路徑之間的切換,也就是組件的切換。
  • Vue 3 Props 類型
    就比如我們子組件需要用到父組件的數據,我們到底該使用何種方式傳遞進去呢?我們都知道在原生 DOM 中有一種 data- 屬性,可以將數據綁定,所以類似這種方式,props 就應運而生了。post: { id: 1, title: 'My Journey with Vue'}下面的模板:<test-comv-bind="post"></test-com>等價於:<test-comv-bind:id="post.id"v-bind:title="post.title"></test-com>單向數據流
  • Vue組件的通信--eventBus
    Vue.js兄弟組件之間傳遞數據。為此,我們可以創建一個快速的解決方案並實現EventBus,也稱作vue的中央事件總線,適用於跨級或兄弟組件。EventBus允許我們在一個組件中發出一個事件,而在另一個組件中偵聽該事件。本示例將說明如何在Vue.js應用程式中執行此操作。首先,我們需要一種在組件之間傳輸事件的機制。事實證明。