Vuex는 Vue.js 애플리케이션에 대한 상태 관리 패턴 + 라이브러리 이다.
애플리케이션의 모든 컴포넌트에 대한 중앙 집중식 저장소 역할을 하며 예측 가능한 방식으로 상태를 변경할 수 있다.
또한 Vue의 공식 devtools 확장 프로그램과 통합되어 설정 시간이 필요 없는 디버깅 및 상태 스냅 샷 내보내기/가져오기와 같은 고급 기능을 제공한다.
new Vue({
// 상태
data () {
return {
count: 0
}
},
// 뷰
template: `
<div>{{ count }}</div>
`,
// 액션
methods: {
increment () {
this.count++
}
}
})
그러나 공통의 상태를 공유하는 여러 컴포넌트 가 있는 경우 단순함이 빠르게 저하된다.
prop
가 장황해질 수 있으며,그렇기 때문에 컴포넌트에서 공유된 상태를 추출하여 이를 전역 싱글톤으로 관리해야 한다.
이를 통해 컴포넌트 트리는 커다란 뷰가 되며 모든 컴포넌트는 트리에 상관없이 상태에 액세스하거나 동작을 트리거 할 수 있다.
또한 상태 관리 및 특정 규칙 적용과 관련된 개념을 정의하고 분리함으로써 코드의 구조와 유지 관리 기능을 향상시키게 된다.
Vuex를 아는 것은 좋지만 무조건 사용하는 것은 아니다.
대규모 SPA를 구축하지 않고 Vuex로 바로 시작한다면 시간이 오래 걸리고 힘든 일일 것이다.
앱이 단순한 경우 Vuex 없이도 충분하며 간단한 글로벌 이벤트 버스만 있으면 된다.
그러나 중대형 규모의 SPA를 구축하는 경우, Vue 컴포넌트 외부의 상태를 보다 잘 처리할 수 있는 방법 위해 Vuex를 자연스럽게 선택하게 될 것이다.
<!-- cdn -->
<script src="/path/to/vue.js"></script>
<script src="/path/to/vuex.js"></script>
# with npm
npm install vuex --save
# with yarn
yarn add vuex
--save 옵션 vs --save-dev 옵션
웹팩 추가 설정을 위한 플러그인 라이브러리나 로직과 관련된 외부 라이브러리를 해당 프로젝트에 다운로드하는 옵션 두 옵션의 차이는 npm 설정 파일의 라이브러리 이름이 추가되는 곳이 다르다.
npm install --save
or npm install --save-prod
or npm install -P
:npm install --save-dev
or npm install -D
:npm install -g
:import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
모듈 시스템과 함께 사용하면 Vue.use()
를 통해 Vuex를 명시적으로 추가해야 한다.
모든 Vuex 애플리케이션의 중심에는 store(저장소)가 있다.
store는 기본적으로 애플리케이션 상태 를 보유하고있는 컨테이너이다.
Vuex 저장소와 일반 전역 개체는 다른 점이 두 가지 있다.
Vuex를 설치한 후 저장소를 만든 후 state에 data 초기값을 선언하고 mutations에 data 변경 함수를 작성한다.
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
const store = new Vuex.Store({
// Data 저장소
state: {
count: 0,
},
// Data 변경 도구
mutations: {
increment(state) {
state.count++;
},
},
});
export default store;
state 객체에 store.state
로 접근하여 store.commit()
메소드로 상태 변경을 변이(mutation) 할 수 있다.
<!-- 컴포넌트 -->
<h2>{{ counterState }}</h2>
// 컴포넌트
computed: {
counterState() {
return this.$store.state.count;
},
},
methods: {
increment() {
this.$store.commit('increment');
},
},
store.state.count
를 직접 변경하는 대신 변이(mutation)를 수행하는 이유는 명시적으로 추적을 하기 때문이다.
간단한 규칙에 따라 의도를 보다 명확하게 표현할 수 있으므로 코드를 읽을 때 상태 변화를 더 잘 지켜볼 수 있다.
또한 Vue Devtools로 모든 변이(mutation)를 기록하고 상태 스냅샷을 저장하거나 시간 흐름에 따라 디버깅을 할 수 있는 도구를 제공한다.
컴포넌트 안에서 store state를 사용하는 것은 단순히 계산된 속성 내에서 상태를 반환하는 것이다. 변경을 트리거하는 것은 컴포넌트 메소드에서 변경을 커밋(commit)하는 것을 의미한다.