如何在Vuex中存储非活动数据?

hed*_*din 8 javascript vue.js vuex vuejs2

我有数据,在VueJS-application init之前加载到页面一次,并且这些数据不会一直改变,而html-page不会重新加载(经典的CGI应用程序,而不是SPA).数据示例:

const nonReactiveObjectWithSomeNestedData = {
  a: 'a',
  b: {
    bb: 'bb',
    cc: { ccc: 'ccc' },
    dd: ['dd1', 'dd2']
  }
}
Run Code Online (Sandbox Code Playgroud)

我在几个vue组件中使用这些数据.将这些数据存储在Vuex命名空间模块中并使用Vuex-getters为不同的vue组件包装相同的功能会很方便.有没有办法存储这些数据不在vuex内state(不需要反应)但能否从vuex-module的getter访问?

PS.目前我正在使用在vue-instance方法中存储非反应性数据,但现在还不够,我需要更多的全局数据访问(来自两个独立的根组件).

Lin*_*org 17

在将对象添加到商店之前冻结对象:

Object.freeze(nonReactiveObjectWithSomeNestedData )
Run Code Online (Sandbox Code Playgroud)

Vue不会使冷冻物体反应.

注意:在进入Vuex变异/动作之前,您应该冻结对象:

this.$store.dispatch('moduleName/setNonReactiveObject', 
    Object.freeze(nonReactiveObjectWithSomeNestedData));
Run Code Online (Sandbox Code Playgroud)

在内部突变功能中,有效负载参数已经被反应.

  • 1.复制`const copy = {..original}`,2.更改该副本,3.冻结副本,4.用副本替换存储中的原始文件. (4认同)
  • 如果我们以后需要更改该对象但仍然不想要反应性怎么办? (3认同)

nja*_*jam 5

还可以_isVue向对象添加属性以避免使其具有反应性。

commit('setNonReactiveObject', Object.assign(data, { _isVue: true })
Run Code Online (Sandbox Code Playgroud)

当无法控制数据在存储中的存储方式时,此方法可用于使数据非反应性。例如,当存储数据完全替换客户端以“水合”服务器端呈现的网站(例如 Nuxt)时。

这是未记录的,将来可能会中断。至少源代码有一个注释,表明这个属性是在内部使用的。而这里是向财产前检查观察的对象。