美文网首页
Vuex持久化插件:vuex-persistedstate

Vuex持久化插件:vuex-persistedstate

作者: CodeMT | 来源:发表于2022-09-19 17:46 被阅读0次

    Vuex是在中大型项目中必不可少的状态管理组件,刷新会重新更新状态,但是有时候我们并不希望如此。例如全局相关的,如登录状态、token、以及一些不常更新的状态等,我们更希望能够固化到本地,减少无用的接口访问,以及更佳的用户体验。

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

    • vuex优势: 相比sessionStorage,存储数据更安全,sessionStorage可以在控制台被看到。
    • vuex劣势: 在F5刷新页面后,vuex会重新更新state,所以,存储的数据会丢失。

    手动利用HTML5的本地存储

    vuexstatelocalStoragesessionStorage或其它存储方式中取值 在mutations定义的方法里对vuex的状态操作的同时对存储也做对应的操作。这样state就会和存储一起存在并且与vuex同步
    问题:最直观的就是,手动写比较麻烦

    利用vuex-persistedstate插件

    vuex可以进行全局的状态管理,但刷新后刷新后数据会消失,这是我们不愿意看到的。怎么解决呢,我们可以结合本地存储做到数据持久化,也可以通过插件vuex-persistedstate

    插件的原理其实也是结合了存储方式,只是统一的配置就不需要手动每次都写存储方法

    安装

    npm install vuex-persistedstate --save
    // 或
    npm i -S vuex-persistedstate
    

    配置使用

    在vuex初始化时候,作为组件引入

    // 在store下的index.js中
    import persistedState from 'vuex-persistedstate'
    export default new Vuex.Store({
        // ...
        plugins: [persistedState()]
    })
    

    vuex-persistedstate默认使用localStorage来固化数据(默认存储于localStorage)

    • 存储sessionStorage的情况(safari的无痕浏览模式)
    import createPersistedState from "vuex-persistedstate"
    const store = new Vuex.Store({
      // ...
      plugins: [
        createPersistedState({
          storage: window.sessionStorage
        })
      ]
    })
    
    • 存储cookie的情况
    import persistedState from 'vuex-persistedstate'
    import * as Cookies from 'js-cookie'
    
    export default new Vuex.Store({
      // ...
      plugins: [
        persistedState({
          storage: {
            getItem: key => Cookies.get(key),
            setItem: (key, value) => Cookies.set(key, value, { 
              expires: 7 
            }),
            removeItem: key => Cookies.remove(key)
          }
        })
      ]
    })
    
    

    默认持久化所有state

    指定需要持久化的state,配置如下

    import createPersistedState from "vuex-persistedstate"
    const store = new Vuex.Store({
      // ...
      plugins: [
        createPersistedState({
          storage: window.sessionStorage,
          reducer(val) {
            return {
              // 只储存state中的assessmentData
              assessmentData: val.assessmentData
            }
          }
         })
      ]
    })
    // vuex引用多个插件的写法
    

    譬如:vuex提示的插件和持久化的插件一起使用,配置如下

    import createPersistedState from "vuex-persistedstate"
    import createLogger from 'vuex/dist/logger'
    
    // 判断环境 vuex提示生产环境中不使用
    const debug = process.env.NODE_ENV !== 'production'
    const createPersisted = createPersistedState({
      storage: window.sessionStorage
    })
    
    export default new Vuex.Store({
      // ...
      plugins: debug ? [
        createLogger(), 
        createPersisted
      ] : [
        createPersisted
      ]
    })
    // plugins要是一个一维数组不然会解析错误
    
    

    API

    createPersistedState([options])使用给定的选项创建插件的新实例。可以提供以下选项来配置您的特定需求的插件:

    • key : 存储持久状态的键。
      默认:vuex

    • paths : 部分持续状态的任何路径的数组。如果没有路径给出,完整的状态是持久的。
      默认:[]

    • reducer : 一个函数,将被调用来基于给定的路径持久化的状态。
      默认:都包含这些值

    • subscriber : 一个被调用来设置突变订阅的函数。
      默认:store => handler => store.subscribe(handler)

    • storage : 而不是(或与)getState和setState。
      默认:localStorage

    • getState : 将被调用以重新水化先前持久状态的函数。
      默认:storage

    • setState : 将被调用来保持给定状态的函数。
      默认:storage

    • filter : 将被调用来过滤将setState最终触发存储的任何突变的函数。
      默认:() => true

    相关文章

      网友评论

          本文标题:Vuex持久化插件:vuex-persistedstate

          本文链接:https://www.haomeiwen.com/subject/ayybvktx.html