Vuex — это централизованное хранилище для управления состоянием в приложениях Vue.js. Оно используется, когда несколько компонентов нуждаются в доступе к общему состоянию.
🟠Подключение Vuex в проект
Сначала установим Vuex, если он ещё не установлен:
npm install vuex
Теперь создадим хранилище (
store)import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
state: {
count: 0
},
mutations: {
increment(state) {
state.count++;
}
},
actions: {
incrementAsync({ commit }) {
setTimeout(() => {
commit('increment');
}, 1000);
}
},
getters: {
doubleCount: state => state.count * 2
}
});
Затем подключаем это хранилище в
main.jsimport Vue from 'vue';
import App from './App.vue';
import store from './store';
Vue.config.productionTip = false;
new Vue({
store, // Подключаем Vuex-хранилище
render: h => h(App)
}).$mount('#app');
🟠Доступ к данным из Vuex (state)
Чтобы получить данные из хранилища (
state), можно использовать this.$store.state или mapState. <template>
<div>
<p>Счетчик: {{ $store.state.count }}</p>
</div>
</template>
С использованием
mapState<script>
import { mapState } from 'vuex';
export default {
computed: {
...mapState(['count'])
}
};
</script>
🟠Изменение состояния (mutations)
В Vuex нельзя изменять
state напрямую, для этого используются mutations. <template>
<button @click="$store.commit('increment')">Увеличить</button>
</template>
Или с помощью
mapMutations<script>
import { mapMutations } from 'vuex';
export default {
methods: {
...mapMutations(['increment'])
}
};
</script>
<template>
<button @click="increment">Увеличить</button>
</template>
🟠Асинхронные действия (actions)
Мутации не поддерживают асинхронные операции, поэтому для этого используются actions.
<template>
<button @click="$store.dispatch('incrementAsync')">Увеличить через 1 сек</button>
</template>
Или с
mapActions<script>
import { mapActions } from 'vuex';
export default {
methods: {
...mapActions(['incrementAsync'])
}
};
</script>
<template>
<button @click="incrementAsync">Увеличить через 1 сек</button>
</template>
🟠Использование геттеров (getters)
Геттеры работают как вычисляемые свойства (
computed), позволяют получать обработанные данные из state. <template>
<p>Удвоенный счетчик: {{ $store.getters.doubleCount }}</p>
</template>
Или с
mapGetters<script>
import { mapGetters } from 'vuex';
export default {
computed: {
...mapGetters(['doubleCount'])
}
};
</script>
<template>
<p>Удвоенный счетчик: {{ doubleCount }}</p>
</template>
🟠Модули Vuex (для больших проектов)
Если приложение большое, можно разделить Vuex-хранилище на модули:
const counterModule = {
state: () => ({ count: 0 }),
mutations: {
increment(state) {
state.count++;
}
},
getters: {
doubleCount: state => state.count * 2
}
};
export default new Vuex.Store({
modules: {
counter: counterModule
}
});Ставь 👍 и забирай 📚 Базу знаний