Contents

05_Vue_What is Vuex?

​

What is Vuex? (공식문서)

Vuex는 Vue.js 애플리케이션에 대한 상태 관리 패턴 + 라이브러리 입니다. 애플리케이션의 모든 컴포넌트에 대한 중앙 집중식 저장소 역할을 하며 예측 가능한 방식으로 상태를 변경할 수 있습니다. 또한 Vue의 공식 devtools 확장 프로그램과 통합되어 설정 시간이 필요 없는 디버깅 및 상태 스냅 샷 내보내기/가져오기와 같은 고급 기능을 제공합니다. (공식문서 설명)

​

1
2
3
4
5
# 설치 명령어
npm i vuex   or   npm install vuex

# 이후 
src폴더안에 vuex폴더를 만들고 store.js라는 파일을 생성. (파일생성위치는 자유롭게 설정가능)

​

그렇다면? 상태관리패턴이란 무엇인가?

​

🤔이를 알아보기 전에 간단히 지난 시간에 알아본 props와 emit의 문제점을 생각해보자!

  1. 많은 components를 통과해야 하는 prop의 경우 테이터 이동을 위한 코드가 장황해질 수 있다.

  2. 형제 components는 부모를 거쳐 데이터를 이동해야 하는 불편함이 발생한다.

    /images/image-20200802223729072.png
    형제 components = 같은 가로층의 components

    심지어 손자 components 끼리 데이터를 이동하려면 엄청나게 많은 props와 emit이 작성되어야 하는데, 이런 불편함을 해소하기 위해 데이터 저장소(STORE)를 생성하는 것을 고민해볼 수 있다.

​

이 때문에 대규모 애플리케이션의 상태를 관리할 수 있는 상태 관리 패턴이 필요해진다. 예를 들면

/images/image-20200802223314342.png
이런 모습으로

이를 단일 상태 트리(single state tree) 로 데이터를 관리한다고 표현한다.

공식문서에 이에 대한 설명이 있는데 내가 생각하는 핵심은 아래와 같다.

  1. 각 애플리케이션마다 하나의 (데이터)저장소만 갖게 한다.
  2. 데이터를 저장하고 이를 불러오기만하면 되니 간편한 코딩이 가능해진다.
  3. ROW 데이터를 저장하는 곳을 지정해 관리하는 곳이 생긴다.

이를 구현해보자.

​


아까 만든 store.js에 기본적인 세팅을 진행해보자. (해당 과정은 총 3 Step으로 구성)

​

Step. 1

store.js에 데이터를 등록(저장)한다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
## store.js

import Vue from "vue"
import Vuex from "vuex"

Vue.use(Vuex)

export default new Vuex.Store({
    // 여기에 state(상태) 정보를 등록해서 사용.
	// ex) 여러형태의 데이터를 구현해보자.
	state: {
        first: '첫번째 데이터입니다.',
        second: 2,
        listData: [
            {name: "john"},
            {name: "poul"},
            {name: "kim"}
        ]
    }
})

## ✨Point: store에 state라는 곳에 데이터를 저장했다는 것을 기억하고 다음으로 넘어가자.

​

Step. 2

저장소(STORE)에 데이터가 입력되었으니 이를 최상위 .js 파일(main.js)에 등록해 모든 영역에서 사용가능**(전역으로 등록)**하게 하자.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
## main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'		(이전에 설명한 router도 설치되었음을 알 수 있다.)
import store from '../src/vuex/store.js'	👈(추가)

Vue.config.productionTip = false

new Vue({
  router,		(이전에 설명한 router도 설치되었음을 알 수 있다.22)
  store,	👈(추가)
  render: h => h(App)
}).$mount('#app')

​

Step. 3

store에 저장된 데이터를 불러와 사용한다. (난 Vue_CLI를 사용해, 디폴트 파일인 About.vue에 출력한다.)

✋ 여기서 잠깐!

Q. store에 저장된 데이터를 불러오는 방법은 무엇인가요?

A. 여러방법이 있으나 가장 Basic한 방법으로 1. computed를 사용해 불러오는 방법과 2. data를 선언해 사용하는 방법을 알아보자. (이 두 방법을 추천하는 이유는 LifeCycle에서 정리되어 있다.)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
## About.vue  방법.1 (computed를 사용하는 방법)

<template>
  <div>
    <h1>{{result}}</h1>
  </div>
</template>

<script>
export default {
  name: 'About',
  //Step 1.
  computed: {
    result() {
      return this.$store.state
    }
  }
}
</script>
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
## About.vue  방법.2 (data 선언 후 store를 저장해 사용하는 방법)

<template>
  <div>
    <!-- Step. 3 -->
    <h1>{{result}}</h1>
  </div>
</template>

<script>
export default {
  name: 'About',
  //Step. 1
  data() {
    return {
      result: "",
    }
  },
  //Step. 2
  created() {
    this.result = this.$store.state
  }
}
</script>

​

/images/Vuex_00.png
방법에 차이가 있을 뿐 노출되는 화면은 동일하다.


/images/Vuex_02.png
방법.1의 경우 폴더구조
/images/Vuex_03.png
방법.2의 경우 폴더구조

Thanks to ‘이서영’💑