-
store.watch in Vuex :: 마이구미Vue.js 2017. 7. 13. 00:15반응형
이 글은 Vuex 저장소의 상태(state)에 대해 watch 사용법을 다뤄본다.
vuex를 이용할 때 watch 구현 방법을 알아본 후, watch가 작동이 안되는 경우도 원인을 파악할 수 있는 방법을 알아본다.
기본적으로 watch는 상태의 동적 변화를 감지하기 위해 사용한다.
일반적으로 Vue.js는 watch 또는 computed를 활용한다.
Vuex 저장소의 상태 변화를 감지해야할 필요가 있을 수 있다.
크게 2가지로 방법으로 볼 수 있다.
1. store.watch 활용
const store = new Vuex.Store({ state: { n: 10 }, getters: { getN() {return state.n} } })
new Vue({ el: '#app', store, mounted () { setInterval(() => { this.$store.state.n++ }, 1000) this.$store.watch(() => this.$store.getters.getN, n => { console.log('watched: ', n) }) } })
2. computed 활용
computed: { getN () { return this.$store.getters.getN } }, watch: { getN (val, oldVal) { console.log('watched: ', val) }
},
상태의 변화는 어떻게 감지되는 지는 this.$store.getters.* 를 확인해보면 알 수 있다.
아래와 같이 console.log를 통해 출력해보면 된다.
Observer, reactiveGetter, reactiveSetter를 볼 수 있다.
getter, setter를 통해 데이터가 변화되면 감지할 수 있는 것이다.
만약, watch를 통해 감지가 안된다면, 해당 Vuex의 getter의 속성을 확인해보면 된다.
위와 같은 속성들이 없다면, 당연히 watch를 통해 변화를 감지할 수 없다.
감지하지 못하는 이슈 중 한 가지는 다음과 같다.
상태가 객체일 때 발생할 수 있다.
객체 자체에 getter, setter를 넣을 수 없기 때문이다.
이러한 경우 해결법은 공식 문서에서 확인할 수 있다.
Prefer initializing your store's initial state with all desired fields upfront.
When adding new properties to an Object, you should either:
Use
Vue.set(obj, 'newProp', 123)
, or -Replace that Object with a fresh one. For example, using the stage-3 object spread syntax we can write it like this:
state.obj = { ...state.obj, newProp: 123 }
1. 원하는 모든 필드에 대해 초기화
2. 객체의 속성 추가할 때,
Vue.set을 통해 객체 프로퍼티를 추가하거나,
spread 문법을 통해 객체를 쪼갠 다음, 다시 추가하여, getter, setter가 들어가게 한다.
다른 문제인 경우는 라이프 사이클 훅(Lifecycle Hooks) 이슈가 크다.
이 경우는 다음 링크를 참고하자.
vuex-reactivity-rules 관련 문서
https://vuex.vuejs.org/en/mutations.html#mutations-follow-vues-reactivity-rules
반응형'Vue.js' 카테고리의 다른 글
created vs mounted in Vue.js :: 마이구미 (2) 2017.08.18 Vue.js와 jQuery 공존하기 :: 마이구미 (0) 2017.08.04 Virtual DOM이란 무엇인가? :: 마이구미 (1) 2017.07.29 Vue.js에서 줄바꿈 적용하기 :: 마이구미 (0) 2017.07.25 strict mode in Vuex :: 마이구미 (0) 2017.06.06