728x90
반응형
Vuex 설치하기
- Vuex는 싱글 파일 컴포넌트 체계에서 NPM 방식으로 라이브러리를 설치하는게 좋다.
- ES6와 함께 사용해야 더 많은 기능과 이점을 제공받을 수 있다.
// Terminal
npm install vuex --save
Vuex 등록하기
1. src/store/store.js
생성
// store.js
import Vue from "vue";
import Vuex from "vuex";
// Vue 플러그인 사용
// 전역 기능을 사용하기 위해
Vue.use(Vuex);
export const stroe = new Vuex.Store({
//
});
2. main.js
에 store.js
파일 import
// main.js
import Vue from 'vue'
import App from './App.vue'
import { store } from './store/store'
Vue.config.productionTip = false
new Vue({
store,
render: h => h(App),
}).$mount('#app')
Vuex 기술 요소
state
- 여러 컴포넌트 간에 공유할 데이터
// Vue
data: {
message : 'Hello Vue.js!'
}
// Vuex
state: {
message: 'Hello Vue.js!'
}
<!-- Vue -->
<p>{{ message }}</p>
<!-- Vuex -->
<p>{{ this.$store.state.message }}</p>
getters
state
값을 접근하는 속성이자computed()
처럼 미리 연산된 값을 접근하는 속성
// store.js
state: {
num: 10
},
getters: {
getNumber(state) {
return state.num;
},
doubleNumber(state) {
return state.num * 2;
}
}
<p>{{ this.$store.getters.getNumber }}</p>
<p>{{ this.$store.getters.doubleNumber }}</p>
mutations
state
의 값을 변경할 수 있는 유일한 방법이자 메서드mutation
은commit()
으로 동작시킨다.
// store.js
state: {num: 10},
mutations: {
// 첫번째 인자는 무조건 state
printNumbers(state) {
return state.num
},
sumNumbers(state, anotherNum) {
return state.num + anotherNum;
}
}
// App.vue
// commit(type, payload, options)
this.$store.commit('printNumbers');
this.$store.commit('sumNumbers', 20);
mutations의 commit() 형식
state
를 변경하기 위해mutations
를 동작시킬 때 인자(payload
)를 전달할 수 있음
// store.js
state: { storeNum: 10 },
mutations: {
// 객체를 인자로 받아 사용 가능하다.
modifyState(state, payload) {
console.log(payload.str);
return state.storeNum += payload.num;
}
}
// App.vue
this.$store.commit('modifyState', {
str: 'passed from payload',
num: 20
});
state는 왜 직접 변경하지 않고 mutations로 변경하는가
- 여러 개의 컴포넌트에서 아래와 같이
state
값을 변경하는 경우 어느 컴포넌트에서 해당state
를 변경했는지 추적하기가 어렵다.
methods: {
increaseCounter() { this.$store.state.counter++; }
}
- 특정 시점에 어떤 컴포넌트가
state
를 접근하여 변경한 건지 확인하기 어렵기 때문 - 따라서, 뷰의 반응성을 거스르지 않게 명시적으로 상태 변화를 수행. 반응성, 디버깅, 테스팅 혜택
actions
- 비동기 처리 로직을 선언하는 메서드. 비동기 로직을 담당하는
mutations
- 데이터 요청, Promise, ES6 async과 같은 비동기 처리는 모두
actions
에 선언
// store.js
state: { num: 10 },
mutaions: {
doubleNumber(state) {
state.num * 2;
}
},
actions: {
delayDoubleNumber(context) { // context로 store의 mutations와 state 접근 가능
// this.$store.commit('doubleNumber');
context.commit('doubleNumber');
}
}
// App.vue
this.$store.dispatch('delayDoubleNumber'); // actions 실행은 dispatch 함수 사용
actions 비동기 코드 예제 1
- 2초정도 지난 후 카운트 증가하는 기능
// store.js
mutations: {
addCounter(state) {
state.counter++;
}
},
actions: {
delayedAddCounter(context) {
setTimeout(() => context.commit('addCounter'), 2000);
}
}
// App.vue
methods: {
incrementCounter() {
this.$store.dispatch('delayedAddCounter');
}
}
actions 비동기 코드 예제 2
- 특정 url에서 상품 정보를 받아 저장하는 기능
// store.js
mutations: {
setData(state, fetchedData) {
state.product = fetchedData;
}
},
actions: {
fetchProductData(context) {
return axios.get('https://domain.com/products/1')
.then(response => context.commit('setData', response));
}
}
// App.vue
methods: {
getProduct() {
this.$store.dispatch('fetchProductData');
}
}
왜 비동기 처리 로직은 actions에 선언해야 하는가
- 언제 어느 컴포넌트에서 해당
state
를 호출하고, 변경했는지 확인하기가 어려움 - 그렇기 때문에
state
값의 변화를 추적하기 어렵기 때문에mutations
속성에는 동기 처리 로직만 넣어야 한다.
728x90
반응형
'Dev > Vue.js' 카테고리의 다른 글
[Vue.js] Vuex - 프로젝트 구조화 및 모듈화 (0) | 2020.09.14 |
---|---|
[Vue.js] Vuex - 헬퍼 함수 (0) | 2020.09.14 |
[Vue.js] Vuex (0) | 2020.09.11 |
[Vue.js] ES6 (0) | 2020.09.11 |
[Vue.js] Todo App 사용자 경험 개선하기 (0) | 2020.09.10 |
댓글