복잡한 어플리케이션의 컴포넌트들을 효츌적으로 관리하는 라이브러리
https://v3.vuex.vuejs.org/kr/installation.html
npm install vuex --save
container를 생성한다
import {createStore} from 'vuex'
const storage = {
}
// 이건 vue2버전 방식이다
// Store = 첫글자 대문자!!
//export const store = new Vuex.Store({
export default createStore({
state: {
testText: 'Learn Vuex',
}
});
main.js에 vuex를 전역변수로 등록해주자.
import { createApp } from 'vue'
import App from './App.vue'
import { store } from './store/store'
// use() : 플러그인
// vue를 사용하는 모든 영역에 글로벌 function을 추가하고자 할 때 사용
createApp(App).use(store).mount('#app')
// vue 버전2
// new Vue({
// el: '#app',
// store,
// render: h => h(App)
// });
여러 컴포넌트 간에 공유할 데이터를 뜻함
// vue
data: {
message: 'Hello Vue.js'
}
// vuex
state: {
message: 'Hello Vue.js'
}
<!-- Vue -->
<p>{{ message }} </p>
<!-- vuex -->
<p>{{ this.$store.state.message }} </p>
state값에 접근하는 속성이자 computed()처럼 미리 연산된 값에 접근할때 사용하는 속성
state: {
num: 10
}
getters: {
doubleNumber(stat){
return state.num * 2;
}
}
<p>{{ this.$store.getters.doubleNumber }}</p>
doubleNumber에 접근함으로 이미 연산된 값에 접근할 수 있음
// store.js
state: {num: 10},
mutations: {
// mutation 내의 메서드에는 첫번째 인자로 state가 넘어감
printNumbers(state){
return state.num;
},
sumNumbers(state, anotherNum){
return state.num + anotherNum;
}
}
// App.vue
// commit : 인자와 일치하는 mutation 메서드를 실행시킴
this.$store.commit('printNumbers');
this.$store.commit('sumNumbers', 20);
// store.js
state: {stateNum: 10},
mutations: {
sumNumber(state, payload){
console.log(payload.str);
return state.stateNum += payload.num;
}
}
// App.vue
this.$store.commit('modifyState', {
str : 'passed from payload',
num : 20
});
직접 state를 이용해 값을 변경하지 않고 mutations를 이용해 변경하는걸까?
여러 컴포넌트에서 state를 변경하는 경우 어떤 컴포넌트에서 변경했는지, 어떤 시점에 변경한건지 추적이 어렵다.
vuex는 vue core팀에서 만든 라이브러리로 flux패턴을 vue에 맞춰 구현해놓았기 때문에 mutations를 거치지 않으면 vue의 반응성(directive)이나 명시적 상태 변화를 수행하기 어렵기 때문에 state의 값을 변경하려면 mutations를 활용해야 한다.
// store.js
state: {
num: 10
},
mutations: {
doubleNumber(state){
state.num * 2;
}
},
actions: {
// context로 store의 메서드와 속성에 접근
delayDoubleNumber(context){
context.commit('doubleNumber');
}
}
// App.vue
this.$store.dispatch('delayDoubleNumber');
// store.js
mutations: {
addCounter(state){
state.counter++
}
},
actions: {
delayedAddCounter(context){
setTimeout(() => context.commit('addCounter'), 2000);
}
}
// App.vue
methods: {
incrementCounter() {
this.$store.dispatch('delayedAddCounter');
}
}
//store.js
mutations: {
setData(state, fetchedData){
state.product = fetchedData;
}
},
actions: {
fetchedData(context){
return axios.get('http://domain.com/products/1')
.then(response => context.commit('setData', response));
}
}
// App.vue
methods: {
getProduct() {
this.$store.dispatch('fetchProductData');
}
}
따라서 actions에는 비동기 처리 로직을 선언하고, mutations에는 동기 처리 로직을 선언해야 한다.