如何让Vuex刷新页面数据不丢失?实现方法和原理 vuex-persistedstate 和 vuex-persist的使用

如题:由于vue自身特性的原因,vuex中的数据在页面刷新之后其中的数据会初始化,这就导致组件之间通过vuex传递的数据在用户f5刷新页面之后会丢失

页面刷新后,想保存页面未保存的数据。我们总是习惯于放在浏览器的sessionStorage和localStorage中。但是用了vue后,vuex便可以被应用了。

vuex的优劣势:

  •      优势:相比sessionStorage,存储数据更安全,sessionStorage可以在控制台被看到
  •      劣势:在F5刷新页面后,vuex会重新更新state,所以,存储的数据会丢失。
  •      为了克服这个问题,vuex-persistedstate和 vuex-persist出现了~~

原理:

  • 将vuex的state存在localStorage或sessionStorage或cookie中一份
  • 刷新页面的一瞬间,vuex数据消失,vuex回去sessionStorage中哪会数据,变相的实现了数据刷新不丢失~

区别与建议: 个人还是推荐使用vuex-persistedstate,因为使用vuex-persist在一些浏览器,ie和微信会出现语法报错的问题

  • vuex-persist是TypeScript类型,vuex-persistedstate是JavaScript类型,默认vue的webpack是没有对TypeScript进行编译的
  • 如果想要使用vuex-persist需要手动配置一下webpack使用 webpack 编译 TypeScript 代码

第一种:vuex-persistedstate

  • 结构
  • 安装
    npm install vuex-persistedstate  --save
  • 引入及配置
    • 在store下的index.js中
    • import Vue from 'vue';
      import Vuex from 'vuex';
      import info from './modules/user-info';
      import knowledge from './modules/knowledge';
      import sixElements from './modules/six-elements';
      import difficultySpeed from './modules/difficulty-speed';
      
      import createPersistedState from 'vuex-persistedstate';
      
      Vue.use(Vuex);
      
      const store = new Vuex.Store({
          modules: {
              info,
              knowledge,
              sixElements,
              difficultySpeed
          },
          plugins: [
              createPersistedState({
                  storage: window.sessionStorage,
                  paths: ["info", "knowledge", "sixElements", "difficultySpeed"]
              })
          ],
      });
      
      export default store;
      

    • vuex-persistedstate源码地址及API

第二种:vuex-persist

  • 目录结构
  • 安装
    npm install vuex-persist --save

     

  • 引入及配置
    • 在store下的index.js中
  • import Vue from 'vue';
    import Vuex from 'vuex'
    import VuexPersistence from 'vuex-persist'
    import conversion from './modules/conversion'
    import userInfo from './modules/userInfo'
    import tagviews from './modules/tagviews'
    
    Vue.use(Vuex);
    
    const vuexLocal = new VuexPersistence({
        key: 'message',
        storage: window.localStorage,
        reducer: (state) => ({userInfo: state.userInfo})
    })
    const vuexSession = new VuexPersistence({
        key: 'message',
        storage: window.sessionStorage,
        reducer: (state) => ({tagviews: state.tagviews})
      })
    const store = new Vuex.Store({
        modules: {
            conversion,
            userInfo,
            tagviews
        },
        plugins: [vuexSession.plugin, vuexLocal.plugin]
    })
      
    export default store

     

  • vuex-persist的API

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`vuex-persistedstate` 可以将 Vuex 的状态持久化到本地存储中,以便在应用程序重新加载时恢复状态。在使用 `vuex-persistedstate` 之前,需要先安装和配置它。 安装: ``` npm install vuex-persistedstate ``` 配置: ```javascript import createPersistedState from "vuex-persistedstate"; const store = new Vuex.Store({ // ... plugins: [ createPersistedState({ // 配置项 }) ] }); ``` 接下来,您可以使用 `createPersistedState` 的 `key` 选项来设置在本地存储中存储状态的键。 ```javascript const store = new Vuex.Store({ // ... plugins: [ createPersistedState({ key: "my-app" }) ] }); ``` 现在,您可以在 Vuex store 中使用 `localStorage` 存储状态。例如: ```javascript const store = new Vuex.Store({ // ... mutations: { increment(state) { state.count++; } }, plugins: [ createPersistedState({ key: "my-app" }) ] }); ``` 在上面的示例中,每当 `increment` mutation 在 store 中被调用时,`vuex-persistedstate` 将自动将新的 `state` 对象序列化并保存到 `localStorage` 中。 要从本地存储中检索状态,只需在创建 `Vuex` store 时将 `createPersistedState` 插件添加到 `plugins` 列表中即可。例如: ```javascript const store = new Vuex.Store({ // ... plugins: [ createPersistedState({ key: "my-app" }) ] }); // 在 store 创建后,初始状态将从本地存储中加载。 ``` 您可以通过传递 `getState` 函数来配置 `createPersistedState` 来自定义从本地存储中检索状态的行为。例如: ```javascript const store = new Vuex.Store({ // ... plugins: [ createPersistedState({ key: "my-app", getState: (key) => JSON.parse(localStorage.getItem(key)), }) ] }); ``` 在上面的示例中,`getState` 函数将从 `localStorage` 中检索状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值