Demo
Update the state's values and check your browser's sessionStorage, try refreshing the page.
Source code
Component
<template>
<div>
<fieldset>
<legend>Global state</legend>
<input
type="text"
v-model="newGlobalAttr" />
<button
type="button"
@click="setGlobalAttr(newGlobalAttr)">Update globalAttr
</button>
<br />
<code>globalAttr: {{ globalAttr }}</code>
</fieldset>
<hr />
<fieldset>
<legend>Unnamed module state</legend>
<input
type="text"
v-model="newUnnamedModuleAttr" />
<button
type="button"
@click="setUnnamedModuleAttr(newUnnamedModuleAttr)">Update unnamedModuleAttr
</button>
<br />
<code>unnamedModuleAttr: {{ unnamedModuleAttr }}</code>
</fieldset>
<hr />
<fieldset>
<legend>Named module state</legend>
<input
type="text"
v-model="newNamedModuleAttr" />
<button
type="button"
@click="setNamedModuleAttr(newNamedModuleAttr)">Update namedModuleAttr
</button>
<br />
<code>namedModuleAttr: {{ namedModuleAttr }}</code>
</fieldset>
<hr />
<h5>Toogle - Dynamic modules</h5>
<button
type="button"
@click="toggleUnnamedDynamicModule">
Unnamed Dynamic Module
</button>
<button
type="button"
@click="toggleNamedDynamicModule">
Named Dynamic Module
</button>
<button
type="button"
@click="toggleNestedUnnamedDynamicModule">
Nested Unnamed Dynamic Module
</button>
<button
type="button"
@click="toggleNestedNamedDynamicModule">
Nested Named Dynamic Module
</button>
<fieldset v-if="unnamedDynamic">
<legend>Unnamed dynamic module</legend>
<input
type="text"
v-model="newUnnamedDynamicModuleAttr" />
<button
type="button"
@click="$store.commit('setUnnamedDynamicModuleAttr', newUnnamedDynamicModuleAttr)">Update unnamedDynamicModuleAttr
</button>
<br />
<code>unnamedDynamicModuleAttr: {{ $store.state.UnnamedDynamicModule.unnamedDynamicModuleAttr }}</code>
</fieldset>
<fieldset v-if="namedDynamic">
<legend>Named dynamic module</legend>
<input
type="text"
v-model="newNamedDynamicModuleAttr" />
<button
type="button"
@click="$store.commit('NamedDynamicModule/setNamedDynamicModuleAttr', newNamedDynamicModuleAttr)">
Update namedDynamicModuleAttr
</button>
<br />
<code>namedDynamicModuleAttr: {{ $store.state.NamedDynamicModule.namedDynamicModuleAttr }}</code>
</fieldset>
<fieldset v-if="nestedUnnamedDynamic">
<legend>Nested Unnamed dynamic module</legend>
<input
type="text"
v-model="newNestedUnnamedDynamicModuleAttr" />
<button
type="button"
@click="$store.commit('setNestedUnnamedDynamicModuleAttr', newNestedUnnamedDynamicModuleAttr)">
Update nestedUnnamedDynamicModuleAttr
</button>
<br />
<code>nestedUnnamedDynamicModuleAttr: {{ $store.state['bacon/NestedUnnamedDynamicModule'].nestedUnnamedDynamicModuleAttr }}</code>
</fieldset>
<fieldset v-if="nestedNamedDynamic">
<legend>Nested Named dynamic module</legend>
<input
type="text"
v-model="newNestedNamedDynamicModuleAttr" />
<button
type="button"
@click="$store.commit('bacon/NestedNamedDynamicModule/setNestedNamedDynamicModuleAttr', newNestedNamedDynamicModuleAttr)">
Update nestedNamedDynamicModuleAttr
</button>
<br />
<code>nestedNamedDynamicModuleAttr: {{ $store.state['bacon/NestedNamedDynamicModule'].nestedNamedDynamicModuleAttr }}</code>
</fieldset>
</div>
</template>
<script>
import store from './store';
import { mapMutations, mapState } from 'vuex';
import unnamedDynamicModule from './store/unnamed-dynamic';
import namedDynamicModule from './store/named-dynamic';
import nestedNamedDynamicModule from './store/nested-named-dynamic';
import nestedUnnamedDynamicModule from './store/nested-unnamed-dynamic';
export default {
name: 'Demo',
store,
data,
computed: {
...mapState(['globalAttr']),
...mapState({ unnamedModuleAttr: state => state.UnnamedModule.unnamedModuleAttr }),
...mapState('NamedModule', ['namedModuleAttr'])
},
methods: {
...mapMutations(['setGlobalAttr', 'setUnnamedModuleAttr']),
...mapMutations('NamedModule', ['setNamedModuleAttr']),
toggleUnnamedDynamicModule,
toggleNamedDynamicModule,
toggleNestedNamedDynamicModule,
toggleNestedUnnamedDynamicModule
}
};
function data() {
return {
newGlobalAttr: null,
newUnnamedModuleAttr: null,
newNamedModuleAttr: null,
unnamedDynamic: false,
newUnnamedDynamicModuleAttr: null,
namedDynamic: false,
newNamedDynamicModuleAttr: null,
nestedNamedDynamic: false,
newNestedNamedDynamicModuleAttr: null,
nestedUnnamedDynamic: false,
newNestedUnnamedDynamicModuleAttr: null
};
}
function toggleUnnamedDynamicModule() {
if (this.unnamedDynamic) {
this.$store.unregisterModule('UnnamedDynamicModule');
} else {
this.$store.registerModule('UnnamedDynamicModule', unnamedDynamicModule);
}
this.unnamedDynamic = !this.unnamedDynamic;
}
function toggleNamedDynamicModule() {
if (this.namedDynamic) {
this.$store.unregisterModule('NamedDynamicModule');
} else {
this.$store.registerModule('NamedDynamicModule', namedDynamicModule);
}
this.namedDynamic = !this.namedDynamic;
}
function toggleNestedUnnamedDynamicModule() {
if (this.nestedUnnamedDynamic) {
this.$store.unregisterModule('bacon/NestedUnnamedDynamicModule');
} else {
this.$store.registerModule('bacon/NestedUnnamedDynamicModule', nestedUnnamedDynamicModule);
}
this.nestedUnnamedDynamic = !this.nestedUnnamedDynamic;
}
function toggleNestedNamedDynamicModule() {
if (this.nestedNamedDynamic) {
this.$store.unregisterModule('bacon/NestedNamedDynamicModule');
} else {
this.$store.registerModule('bacon/NestedNamedDynamicModule', nestedNamedDynamicModule);
}
this.nestedNamedDynamic = !this.nestedNamedDynamic;
}
</script>
Vuex's configuration
import Vue from 'vue';
import Vuex from 'vuex';
import VuexStoragePlugin from './../../../../src/vuex-storage-plugin';
import UnnamedModule from './unnamed';
import NamedModule from './named';
Vue.use(Vuex);
export default new Vuex.Store({
plugins: [
new VuexStoragePlugin({
prefix: 'Demo',
storage: sessionStorage,
populate: [
{
attr: 'globalAttr',
mutation: 'setGlobalAttr'
},
...UnnamedModule.populate,
...NamedModule.populate
]
})
],
modules: {
UnnamedModule,
NamedModule
},
state: {
globalAttr: null
},
mutations: {
setGlobalAttr(state, attr) {
state.globalAttr = attr;
}
}
});
Unnamed module
export default {
populate: [
{
module: 'UnnamedModule',
attr: 'unnamedModuleAttr',
mutation: 'setUnnamedModuleAttr'
}
],
state: {
unnamedModuleAttr: null
},
mutations: {
setUnnamedModuleAttr(state, value) {
state.unnamedModuleAttr = value;
}
}
}
Named module
export default {
namespaced: true,
populate: [
{
module: 'NamedModule',
attr: 'namedModuleAttr',
mutation: 'setNamedModuleAttr'
}
],
state: {
namedModuleAttr: null
},
mutations: {
setNamedModuleAttr(state, value) {
state.namedModuleAttr = value;
}
}
}
Unnamed dynamic module
export default {
populate: [
{
attr: 'unnamedDynamicModuleAttr',
mutation: 'setUnnamedDynamicModuleAttr'
}
],
state: {
unnamedDynamicModuleAttr: null
},
mutations: {
setUnnamedDynamicModuleAttr(state, value) {
state.unnamedDynamicModuleAttr = value;
}
}
}
Named dynamic module
export default {
namespaced: true,
populate: [
{
attr: 'namedDynamicModuleAttr',
mutation: 'setNamedDynamicModuleAttr'
}
],
state: {
namedDynamicModuleAttr: null
},
mutations: {
setNamedDynamicModuleAttr(state, value) {
state.namedDynamicModuleAttr = value;
}
}
}
Unnamed nested dynamic module
export default {
populate: [
{
module: 'bacon/NestedUnnamedDynamicModule',
attr: 'nestedUnnamedDynamicModuleAttr',
mutation: 'setNestedUnnamedDynamicModuleAttr'
}
],
state: {
nestedUnnamedDynamicModuleAttr: null
},
mutations: {
setNestedUnnamedDynamicModuleAttr(state, value) {
state.nestedUnnamedDynamicModuleAttr = value;
}
}
}
Named nested dynamic module
export default {
namespaced: true,
populate: [
{
module: 'bacon/NestedNamedDynamicModule',
attr: 'nestedNamedDynamicModuleAttr',
mutation: 'setNestedNamedDynamicModuleAttr'
}
],
state: {
nestedNamedDynamicModuleAttr: null
},
mutations: {
setNestedNamedDynamicModuleAttr(state, value) {
state.nestedNamedDynamicModuleAttr = value;
}
}
}