Reputation: 1024
I have data, that loaded on page once before VueJS-application init, and this data will not change for all time while html-page will not reload (classic CGI application, not SPA). Data example:
const nonReactiveObjectWithSomeNestedData = {
a: 'a',
b: {
bb: 'bb',
cc: { ccc: 'ccc' },
dd: ['dd1', 'dd2']
}
}
I am using this data in a few vue-components. It would be handy to store this data in Vuex namespaced module and to use Vuex-getters for wrapping same functionality for different vue-components. Is there any way to store this data not inside vuex state
(reactivity not needed) but with ability to access from vuex-module's getter?
PS. Currently I am using storing non-reactive data inside vue-instance method, but now it is not enough, I need more global access to data (from two independent root-components).
Upvotes: 17
Views: 7219
Reputation: 165
In mutation file you can deep clone the payload that you don't want to be reactive
import _ from 'lodash';
[mutationTypes.SET_INITIAL_STATE](state, payload) {
// In order to make sure that this property is non-reactive deep clone it
state.initialState = _.cloneDeep(payload)
}
This way the initialState or whatever property you're adding to the state, won't be reactive.
Upvotes: 0
Reputation: 3420
I was able to remove the "reactiveness" by doing something like this
// create new variable and remove reactiveness, does a deep clone
var someNewNonReactiveVar = JSON.parse(JSON.stringify(someReactiveVar));
Upvotes: 1
Reputation: 1363
One can also add a property _isVue
to the object to avoid making it reactive.
commit('setNonReactiveObject', Object.assign(data, { _isVue: true })
This approach can be useful to make data non-reactive when there's no way to control how the data is stored in the store. For example when store data is completely replaced client-side to "hydrate" a server-side rendered website (e.g. Nuxt).
This is undocumented and might break in the future. At least the source code has a comment indicating that this property is used for this internally. And here is where the property is checked before observing the object.
Upvotes: 6
Reputation: 23988
Freeze the object before adding it to the store:
Object.freeze(nonReactiveObjectWithSomeNestedData )
Vue won't make frozen objects reactive.
Note: you should freeze object before it comes into Vuex mutation/action:
this.$store.dispatch('moduleName/setNonReactiveObject',
Object.freeze(nonReactiveObjectWithSomeNestedData));
Inside mutation function the payload-parameter will be already reactive.
Upvotes: 32