18da32b5cSDixsie Wolmers# Store Anatomy 28da32b5cSDixsie Wolmers 38da32b5cSDixsie Wolmers## Store 48da32b5cSDixsie Wolmers 5*7385e139SPatrick WilliamsA "store" is a container that holds the application's state. 6*7385e139SPatrick Williams[Learn more about Vuex.](https://vuex.vuejs.org/) 78da32b5cSDixsie Wolmers 88da32b5cSDixsie Wolmers```sh 98da32b5cSDixsie Wolmers# Store structure 108da32b5cSDixsie Wolmers└── store 118da32b5cSDixsie Wolmers ├── api.js # axios requests 128da32b5cSDixsie Wolmers ├── index.js # import store modules 138da32b5cSDixsie Wolmers ├── plugins 148da32b5cSDixsie Wolmers └── modules 158da32b5cSDixsie Wolmers └── FeatureName # feature module 168da32b5cSDixsie Wolmers ├── FeatureStore.js # feature store 178da32b5cSDixsie Wolmers ├── AdditionalFeatureStore.js # additional features per store 188da32b5cSDixsie Wolmers ├── AnotherFeatureStore.js # additional features per store 198da32b5cSDixsie Wolmers``` 208da32b5cSDixsie Wolmers 218da32b5cSDixsie Wolmers### Modules 228da32b5cSDixsie Wolmers 2349287562SDerick MontagueThe application store is divided into modules to prevent the store from getting 2449287562SDerick Montaguebloated. Each module contains its own state, mutations, actions, and getters. 2549287562SDerick Montague[Learn more about Vuex modules.](https://vuex.vuejs.org/guide/modules.html) 268da32b5cSDixsie Wolmers 278da32b5cSDixsie Wolmers#### Module Anatomy 288da32b5cSDixsie Wolmers 29*7385e139SPatrick Williams- **State:** You cannot directly mutate the store's state. 30*7385e139SPatrick Williams [Learn more about state.](https://vuex.vuejs.org/guide/state.html) 3149287562SDerick Montague- **Getters:** Getters are used to compute derived state based on store state. 3249287562SDerick Montague [Learn more about getters.](https://vuex.vuejs.org/guide/getters.html) 3349287562SDerick Montague- **Mutations:** The only way to mutate the state is by committing mutations, 34*7385e139SPatrick Williams which are synchronous transactions. 35*7385e139SPatrick Williams [Learn more about mutations.](https://vuex.vuejs.org/guide/mutations.html) 3649287562SDerick Montague- **Actions:** Asynchronous logic should be encapsulated in, and can be composed 37*7385e139SPatrick Williams with actions. 38*7385e139SPatrick Williams [Learn more about actions.](https://vuex.vuejs.org/guide/actions.html) 398da32b5cSDixsie Wolmers 408da32b5cSDixsie WolmersImport new store modules in `src/store/index.js`. 418da32b5cSDixsie Wolmers 428da32b5cSDixsie Wolmers```js 438da32b5cSDixsie Wolmers// `src/store/index.js` 448da32b5cSDixsie Wolmers 45*7385e139SPatrick Williamsimport Vue from "vue"; 46*7385e139SPatrick Williamsimport Vuex from "vuex"; 478da32b5cSDixsie Wolmers 48*7385e139SPatrick Williamsimport FeatureNameStore from "./modules/FeatureNameStore"; 498da32b5cSDixsie Wolmers 508da32b5cSDixsie WolmersVue.use(Vuex); 518da32b5cSDixsie Wolmers 528da32b5cSDixsie Wolmersexport default new Vuex.Store({ 538da32b5cSDixsie Wolmers state: {}, 548da32b5cSDixsie Wolmers mutations: {}, 558da32b5cSDixsie Wolmers actions: {}, 568da32b5cSDixsie Wolmers modules: { 578da32b5cSDixsie Wolmers feature: FeatureNameStore, // store names can be renamed for brevity 588da32b5cSDixsie Wolmers }, 598da32b5cSDixsie Wolmers}); 608da32b5cSDixsie Wolmers``` 618da32b5cSDixsie Wolmers 628da32b5cSDixsie Wolmers## Complete store 638da32b5cSDixsie Wolmers 648da32b5cSDixsie WolmersA store module will look like this. 658da32b5cSDixsie Wolmers 668da32b5cSDixsie Wolmers```js 67*7385e139SPatrick Williamsimport api from "@/store/api"; 68*7385e139SPatrick Williamsimport i18n from "@/i18n"; 698da32b5cSDixsie Wolmers 708da32b5cSDixsie Wolmersconst FeatureNameStore = { 718da32b5cSDixsie Wolmers // getters, actions, and mutations will be namespaced 728da32b5cSDixsie Wolmers // based on the path the module is registered at 738da32b5cSDixsie Wolmers namespaced: true, 748da32b5cSDixsie Wolmers state: { 75*7385e139SPatrick Williams exampleValue: "Off", 768da32b5cSDixsie Wolmers }, 778da32b5cSDixsie Wolmers getters: { 788da32b5cSDixsie Wolmers // namespace -> getters['featureNameStore/getExampleValue'] 79*7385e139SPatrick Williams getExampleValue: (state) => state.exampleValue, 808da32b5cSDixsie Wolmers }, 818da32b5cSDixsie Wolmers mutations: { 828da32b5cSDixsie Wolmers // namespace -> commit('featureNameStore/setExampleValue) 83*7385e139SPatrick Williams setExampleValue: (state) => state.exampleValue, 848da32b5cSDixsie Wolmers }, 858da32b5cSDixsie Wolmers actions: { 868da32b5cSDixsie Wolmers // namespace -> dispatch('featureNameStore/getExampleValue') 878da32b5cSDixsie Wolmers async getExampleValue({ commit }) { 888da32b5cSDixsie Wolmers return await api 89*7385e139SPatrick Williams .get("/redfish/v1/../..") 90*7385e139SPatrick Williams .then((response) => { 91*7385e139SPatrick Williams commit("setExampleValue", response.data.Value); 928da32b5cSDixsie Wolmers }) 93*7385e139SPatrick Williams .catch((error) => console.log(error)); 948da32b5cSDixsie Wolmers }, 958da32b5cSDixsie Wolmers // namespace -> ('featureNameStore/saveExampleValue', payload) 968da32b5cSDixsie Wolmers async saveExampleValue({ commit }, payload) { 978da32b5cSDixsie Wolmers return await api 98*7385e139SPatrick Williams .patch("/redfish/v1/../..", { Value: payload }) 998da32b5cSDixsie Wolmers .then(() => { 100*7385e139SPatrick Williams commit("setExampleValue", payload); 1018da32b5cSDixsie Wolmers }) 102*7385e139SPatrick Williams .catch((error) => { 1038da32b5cSDixsie Wolmers console.log(error); 1048da32b5cSDixsie Wolmers }); 1058da32b5cSDixsie Wolmers }, 1068da32b5cSDixsie Wolmers }, 1078da32b5cSDixsie Wolmers}; 1088da32b5cSDixsie Wolmers 1098da32b5cSDixsie Wolmersexport default FeatureNameStore; 1108da32b5cSDixsie Wolmers``` 111