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

2020-12-22 網視界

在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+ElementUI仿微信界面
    項目介紹基於vue2+vuex+vue-cli+element-ui+swiper等技術開發仿微信pc端界面聊天應用,實現了發送消息+表情(動圖gif)、圖片/視頻預覽、右鍵長按菜單、紅包/朋友圈、截圖發送等功能。
  • 快速在你的vue/react應用中實現ssr(服務端渲染)
    所以為了解決SPA應用遇到的這些問題, 我們必須考慮SSR:服務端渲染(ssr),是指由伺服器端完成頁面的HTML結構拼接,並且直接將拼接好的HTML發送到瀏覽器,然後為其綁定狀態與事件,成為完全可交互頁面的處理技術。
  • Vue的異步更新實現原理
    最近面試總是會被問到這麼一個問題:在使用vue的時候,將for循環中聲明的變量i從1增加到100,然後將i展示到頁面上,頁面上的i是從1跳到100,還是會怎樣?答案當然是只會顯示100,並不會有跳轉的過程。怎麼可以讓頁面上有從1到100顯示的過程呢,就是用setTimeout或者Promise.then等方法去模擬。
  • vue 禁止頁面縮放 - CSDN
    initial-scale - 初始的縮放比例minimum-scale - 允許用戶縮放到的最小比例maximum-scale - 允許用戶縮放到的最大比例user-scalable - 用戶是否可以手動縮放maximum-scale、minimum-scale及user-scalable屬性控制允許用戶以怎樣的方式放大或縮小頁面
  • Vue.js布局
    動態Vue.js布局組件前言vue.js是漸進增強的視圖庫,可以作為.html頁面部分使用,也可以結合vue-router、vuex、axios用來構建單頁面或多頁面應用。
  • 在vue項目中使用vuex實現狀態管理的案例
    說明:其實如果項目不是很龐大很複雜,沒有涉及到很多狀態值需要被很多頁面或組件共用;或者某個頁面或組件的行為會對其他頁面或組件造成依賴性的影響。並不需要使用vuex。vuex的使用與否在實際開發中應該視項目情況而定。
  • 如何在vue項目中使用sass並設置元素樣式
    那麼,如何在vue項目中使用sass?新建項目,選擇vue模板2、在項目中src/components文件夾下,新建vue文件,輸入文件名稱,點擊創建文件,利用Element進行頁面布局,插入一個輸入框和一個按鈕,綁定按鈕點擊事件頁面布局,插入一個輸入框和一個按鈕
  • 一張圖教你快速玩轉vue-cli3
    如何安裝項目插件添加瀏覽器支持如何配置scss/stylus共享全局變量如何整合eleemntUI等第三方框架並實現按需引入配置單/多頁面1.安裝項目插件vue add @vue/cli-plugin-eslint# 或vue add xjFilevue add 的設計意圖是為了安裝和調用 Vue CLI
  • VUE 項目如何快速優化?|原力計劃
    如果程式設計師有修改 webpack默認配置的需求,可以在項目根目錄中 按需創建vue.config.js這個配置文件,從而對項目的打包發布過程做自定義配置,具體可以參考 https://cli.vuejs.org/zh/config/#vue-config-js為開發模式和發布模式指定不同的打包入口:
  • Vue-router路由系統詳細介紹
    路由原理傳統開發方式 url改變後 立刻發起請求,響應整個頁面,渲染整個頁面SPA 錨點值改變後 不會發起請求,發起ajax請求,局部改變頁面數據頁面不跳轉 用戶體驗更好SPAsingle page application(單頁應用程式)前端路由錨點值監視ajax獲取動態數據
  • 「查漏補缺」那些漏掉的面試知識
    一旦數據變動,就層層執行回調函數4.vue-router的hash跟history模式4.1 hash模式hash模式, 原本用來結合錨點控制頁面視窗的位置,具有以下特點:在hash模式下,所有的頁面跳轉都是客戶端進行操作,因此對於頁面攔截更加靈活
  • vue的echarts數據管理系統 - CSDN
    哎呀,公司非要用vue做後臺管理系統。我也是第一次做這種類型的項目,然後大家都知道的,後臺管理系統不可或缺的就是數據統計圖和表格了對於走勢圖部分,我用的echarts;在vue中用echarts的步驟:一:npm install echarts --save 在本地目錄安裝echarts 二:在需要的組件中引入echarts     import
  • Vue-count-to(數字滾動計時)
    在實際開發過程中會遇到這種情況:可以看到這裡的數字需要一個滾動的效果這種效果我們可以通過vue-count-to插件來實現實現流程:1.安裝在控制臺輸入npm install vue-count-to來安裝vue-count-to插件2.
  • vue-element-admin v3.6.1 發布,後臺集成方案
    vue-element-admin v3.6.1 已發布,更新內容:vue-element-admin 是基於 vue+element 的後臺集成方案,功能包括:登錄
  • 如何在uni-app項目中使用vue屬性監測表達式
    工具微信開發者工具HBuilderX技術vueuni-appJavaScriptCSS3wxml在vue的數據/選項中,有個watch屬性,可以用來監測表達式的操作數。下面利用實例說明:1、打開HBuilderX開發工具,創建uni-app項目,並新建頁面文件sys
  • 如何創建vue項目並使用element框架中的el-select
    1、在電腦硬碟上,找到一個位置,新建一個文件夾wmn;滑鼠右鍵選擇Git Bash Here,並在Git窗口輸入cnpm install --global vue-cli命令:cnpm install --global vue-cli
  • Vue 3全新的Web開發構建工具——Vite介紹
    不過Vite項目的默認配置文件是vite.config.js,而不是vue.config.js。例如,導入到*.vue文件的內容在發送回瀏覽器之前被即時編譯。這種方法有幾個優點:因為沒有打包工作要做,所以伺服器冷啟動非常快。代碼是按需編譯的,因此只有在當前頁面上實際導入的代碼才會編譯。
  • ./ 安卓版 7.50 重大更新:「IT號」上線、 iOS 14 / Android 11...
    改進:界面 - 「我」頁面的設置一欄增加日夜間模式切換,更加方便改進:功能 - 圈子記錄帖子列表的閱讀順序設置(正序or倒序)修復:界面 - 部分頁面的佔位圖太大的問題修復:界面 - 無圖模式下文章詳情的「相關文章」UI錯亂修復:界面 - 我的頁面列表右側的文字可能會錯亂的問題
  • vue-element-admin v3.9.0 發布,後臺集成方案
    vue-element-admin v3.9.0 已發布,更新內容:refactor[tagsView]: 使用 el-scrollbar 替代之前的滾動方案 #995