# Composition-API-Store
- to make store available in all components: import in
Root App.vueandprovide - you can directly
v-modelthe state - then use computed property with get and set method
- optional: make readonly
pro:
- flexible
- no need to use mutation & actions
cons:
- no dev-tools support
- no plugins (like eg vuex-persist)
- store has to be injected in every component
store/index.js
import { reactive, readonly } from 'vue';
const state = reactive({
counter: 0,
});
const methods = {
decreaseCounter() {
state.counter--;
},
increaseCounter() {
state.counter++;
},
};
const getters = {
doubleCounter() {
return state.counter * 2
},
};
export default {
state,
methods,
getters,
};
you don't have to put the methods in the methods-object. also possible on root-level & export
it might be good to use a readonly state. But then you also have to define a set-method and there's no direct
v-modelexport default { state: readonly(state), methods, getters, };
Home.vue
<template>
<div >
<div class="counter">{{ store.state.counter }}</div>
<div>Double Counter: {{ store.getters.doubleCounter() }}</div>
<div >
<button @click="store.methods.decreaseCounter">-</button>
<button @click="store.methods.increaseCounter">+</button>
</div>
</div>
</template>
<script setup>
import { inject, computed } from "vue";
const store = inject("store");
</script>
App.vue
<script>
import { provide } from 'vue';
import store from '@/store';
export default {
setup() {
provide('store', store);
},
};
</script>
Video: Composition API for State Management (opens new window)
Pinia →