1# Store Anatomy 2 3## Store 4 5A "store" is a container that holds the application's state. 6[Learn more about Vuex.](https://vuex.vuejs.org/) 7 8```sh 9# Store structure 10└── store 11 ├── api.js # axios requests 12 ├── index.js # import store modules 13 ├── plugins 14 └── modules 15 └── FeatureName # feature module 16 ├── FeatureStore.js # feature store 17 ├── AdditionalFeatureStore.js # additional features per store 18 ├── AnotherFeatureStore.js # additional features per store 19``` 20 21### Modules 22 23The application store is divided into modules to prevent the store from getting 24bloated. Each module contains its own state, mutations, actions, and getters. 25[Learn more about Vuex modules.](https://vuex.vuejs.org/guide/modules.html) 26 27#### Module Anatomy 28 29- **State:** You cannot directly mutate the store's state. 30 [Learn more about state.](https://vuex.vuejs.org/guide/state.html) 31- **Getters:** Getters are used to compute derived state based on store state. 32 [Learn more about getters.](https://vuex.vuejs.org/guide/getters.html) 33- **Mutations:** The only way to mutate the state is by committing mutations, 34 which are synchronous transactions. 35 [Learn more about mutations.](https://vuex.vuejs.org/guide/mutations.html) 36- **Actions:** Asynchronous logic should be encapsulated in, and can be composed 37 with actions. 38 [Learn more about actions.](https://vuex.vuejs.org/guide/actions.html) 39 40Import new store modules in `src/store/index.js`. 41 42```js 43// `src/store/index.js` 44 45import Vue from "vue"; 46import Vuex from "vuex"; 47 48import FeatureNameStore from "./modules/FeatureNameStore"; 49 50Vue.use(Vuex); 51 52export default new Vuex.Store({ 53 state: {}, 54 mutations: {}, 55 actions: {}, 56 modules: { 57 feature: FeatureNameStore, // store names can be renamed for brevity 58 }, 59}); 60``` 61 62## Complete store 63 64A store module will look like this. 65 66```js 67import api from "@/store/api"; 68import i18n from "@/i18n"; 69 70const FeatureNameStore = { 71 // getters, actions, and mutations will be namespaced 72 // based on the path the module is registered at 73 namespaced: true, 74 state: { 75 exampleValue: "Off", 76 }, 77 getters: { 78 // namespace -> getters['featureNameStore/getExampleValue'] 79 getExampleValue: (state) => state.exampleValue, 80 }, 81 mutations: { 82 // namespace -> commit('featureNameStore/setExampleValue) 83 setExampleValue: (state) => state.exampleValue, 84 }, 85 actions: { 86 // namespace -> dispatch('featureNameStore/getExampleValue') 87 async getExampleValue({ commit }) { 88 return await api 89 .get("/redfish/v1/../..") 90 .then((response) => { 91 commit("setExampleValue", response.data.Value); 92 }) 93 .catch((error) => console.log(error)); 94 }, 95 // namespace -> ('featureNameStore/saveExampleValue', payload) 96 async saveExampleValue({ commit }, payload) { 97 return await api 98 .patch("/redfish/v1/../..", { Value: payload }) 99 .then(() => { 100 commit("setExampleValue", payload); 101 }) 102 .catch((error) => { 103 console.log(error); 104 }); 105 }, 106 }, 107}; 108 109export default FeatureNameStore; 110``` 111