이 포스팅은 Max의 Vuejs 강좌 내용을 정리한 것이고, VueJS의 개념을 익히고 연습해보기 위한 튜토리얼을 다룬 글 입니다.
이전 포스팅에서는 vuex
를 활용한 프로젝트의 상태 관리 환경 세팅과 vuex
의 기본적인 사용방법에 대해서 알아 보았습니다. 이번 포스팅에서는 또 다른 컴포넌트의 상태 관리 설정을 추가하고 컴포넌트 간의 상태 변화에 따라 뷰가 갱신될 수 있도록 구현해보겠습니다.
1. Portfolio 컴포넌트 생성하기
- 기본적인 Portfolio 컴포넌트 구성은 이전 포스팅에서 Stocks 컴포넌트를 구성한 방법과 유사하므로 코드만 첨부하고 넘어가겠습니다.
- 하나만 설명드리자면 16라인에
v-model.number
을 디렉티브를 사용한 부분이 있는데요,v-model
을 그냥 사용하지 않고 뒷부분에.number
를 붙인 이유는 인풋요소에서 입력한 값에 따라 버튼에 속성을 조절하려고 했는데 인풋요소에서 넘어오는 값이 문자열로 넘어와서 유효성 체크가 되지 않아 숫자 형태로만 넘어가도록 해준것 입니다. - 저도
v-model.number
이렇게 타입 지정까지 해주는 부분이 있는 줄 몰랐었는데 이부분의 오류를 해결하려다 보니 찾게 되었네요.
- 하나만 설명드리자면 16라인에
1 | <template> |
1 | <template> |
2. Portfolio store module 생성하기
1 | const state = { |
이번 글에서는 store 내의 각 요소에 대해서 조금 설명을 해보려고 합니다.
1. state - funds
, stocks
- state에는 해당 컴포넌트 내/외부에서 사용할 데이타들을 미리 정의 해놓고 어디에서나 접근해서 사용 할 수 있게 해줍니다.
funds
는 stock을 구매 할 수 있는 전체 자산의 상태이고,stocks
는 Stocks컴포넌트에서 구매한 stock의 상태입니다.
2. mutations - BUY_STOCK
, SELL_STOCK
- muntation은 vuex에서 state를 변경 할 수 있는 유일한 방법입니다. 주로 action에서 commit함수를 통해 mutation을 호출하고 필요한 변수를 전달하는 방식으로 많이 사용합니다.
- 이전 포스팅을 다시 확인해보시면
BUY_STOCK
을 호출하는 action은 stocks 모듈에 선언되어 있습니다. 해당 action을 사용하는 위치가 Stocks컴포넌트에 있기 때문에 그렇지요, 하지만 portfolio 모듈 안에 선언되어 있는funds
와stacks
state를 수정하기 위해서는 portfolio 내부의 mutation으로만 변경 할 수 있기 때문에 변경 할 state에 접근 가능한 mutation 사용해야 합니다.
3. actions - sellStock
- Portfolio 컴포넌트 내에서 state를 변경하는 기능을 하는 부분은 stocks 되파는 부분뿐 입니다. stocks를 되팔때
sellStock
action에서는 클라이언트에서 팔고자하는 입력받은 수량만SELL_STOCK
mutation에 전달하고 전달 받은 데이타를 가지고 state를 변경하는 것은 mutation에서 실행하는 것입니다.
4. getters - stockPortfolio
, funds
- getter를 사용하는 목적은 프로젝트 어디서나 state의 상태를 좀더 쉽게 조회하기 위함입니다.
stockPortfolio
getter에서는 파라메터로getters
라는 것을 받고 있는데 이 파라메터를 사용하면 store에 등록되어 있는 모든 getter를 담고 있는 객체를 참조 할 수 있습니다.
1 | import Vue from 'vue'; |
5. store에 추가하기
- 모듈 생성이 완료 되었으면 store에 등록해줍니다. 이제 프로젝트 어디서나 등록한 portfolio 모듈을 사용 할 수 있습니다.
3. Portfolio 컴포넌트에 vuex 연결하기
1 | ...생략 |
- 이전 포스팅에서는 store를 사용할 때
this.$store.{...}
방법으로 일일이 찾아와서 사용을 했었는데 이번에는 헬퍼함수를 통해 설정해보았습니다. mapActions
헬퍼를 사용하여 store에 등록되어 있는 action중에 필요한 action만 불러와서 사용합니다.컴포넌트 내에서는 mutation을 건드릴 일은 없습니다. 모든 동작은 action을 통해서 실행됩니다.
...mapActions
과 같이spread operator
를 사용하기 위해서 babel모듈도 설치해줘야 합니다.
npm install --save-dev babel-preset-stage-2
- 설치한 다음
.babelrc
파일에 다음과 같이 설정을 변경해 줍니다..babelrc
파일은 프로젝트 제일 상단인 src 폴더와 같은 위치에 있습니다.
1 | { |
1 | ...생략 |
mapGetters
헬퍼를 사용하여 Portfolio 컴포넌트에서 필요한 데이타를 조합해둔stockPortfolio
getter 를stocks
로 참조하여 사용합니다.
4. Stocks 컴포넌트 수정하기
- 이전 포스팅에서 만들었던 Stocks 컴포넌트의
Stock.vue
에서buyStock
메소드의 결과를 console.log로 확인하였었습니다. portfolio 모듈에BUY_STOCK
mutation을 생성하여서 이를 사용 할 수 있도록 수정해줍니다. - 먼저
src/store/modules/stocks.js
에서buyStock
action의commit();
부분을commit('BUY_STOCK', order);
로 수정합니다. - 그리고
src/components/stocks/Stock.vue
에서buyStock
method의console.log(order);
부분을this.$store.dispatch('buyStock', order);
로 수정합니다.
모두 완료되었다면 아래 영상과 같이 Stock 컴포넌트와 Portfolio 컴포넌트 간에 State의 변화를 확인 할 수 있을것입니다.
git clone
으로 프로젝트를 시작하셨다면git checkout step05
로 이번 포스팅의 마지막 결과물을 확인 하실 수 있습니다.
다음 포스팅은 마지막으로 몇가지 기능을 추가하고vue-resource
와firebase
를 활용해서 DB에 데이타를 저장하고 로드하는 기능까지 구현해보려고 합니다.
필요하신 부분이나 보완할 점이 있다면 댓글로 의견 남겨주시기 바랍니다. 감사합니다.