【问题标题】:Prevent persisted state locking up app in VueX防止 VueX 中的持久状态锁定应用程序
【发布时间】:2019-01-17 22:55:10
【问题描述】:

我正在使用vuex-persistedstate 模块来跟踪我的状态并将其保存到localStorage。问题是由于需要保存的状态量,每次更新我的数据时应用都会被锁定。

为了解决这个问题,我尝试使用一个承诺来允许在生成字符串的同时执行业务计算。字符串准备好后,应将其设置为localStorage

这就是我所拥有的:

const buildLocalStorageString = async (state) => {
  return await JSON.stringify(state);
}

export default new Vuex.Store({
  state: { etc, etc, etc },

  plugins: [createPersistedState({
    key: 'myApp',
    setState (key, state, storage) {
      buildLocalStorageString(state).then(string => {
        storage.setItem(key, string) 
      }) 
    }
  })],
})

问题是,它不能解决问题。应用更新时仍有明显延迟。

【问题讨论】:

    标签: javascript vue.js promise vuex


    【解决方案1】:

    All localStorage calls are synchronous. 并且 Javascript 是单线程的。将 1 大块数据保存到本地存储总是会阻塞所有其他执行。

    我会通过拆分数据并将其分别保存到本地存储中来解决这个问题。基本上,只需使用多个createPersistedState

    一个极其简单的示例实现可能如下所示

    import Vue from 'vue'
    import Vuex from 'vuex'
    import createPersistedState from "vuex-persistedstate";
    
    Vue.use(Vuex)
    
    const moduleA = {
        state: {
            a: 'a'
        },
        mutations: {
            updateA(state) {
                state.a += 'a';
            }
        }
    }
    
    const moduleB = {
        state: {
            b: 'b'
        }
    }
    
    export default new Vuex.Store({
        modules: {
            moduleA: moduleA,
            moduleB: moduleB
        },
        plugins: [createPersistedState({
            key: 'vuex_a',
            paths: ['moduleA']
        }), createPersistedState({
            key: 'vuex_b',
            paths: ['moduleB']
        })]
    })
    

    【讨论】:

    • 这是有道理的。不敢相信我没想过要分裂各州。谢谢!
    • 我认为最好的解决方案是不对这些数据使用持久状态。我只会将其用于帐户详细信息。
    猜你喜欢
    • 2021-05-17
    • 2021-04-24
    • 2018-09-02
    • 2011-06-19
    • 1970-01-01
    • 2019-03-18
    • 2021-08-27
    • 1970-01-01
    • 2021-12-02
    相关资源
    最近更新 更多