<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<!-- Vuex를 사용하기 위해 CDN 연결 -->
<script src="https://unpkg.com/vuex"></script>
</head>
<body>
<div id="app">
<h1>안녕하세요!</h1>
<!-- 카운터 신규 엘리먼트 2개 사용. msg 속성에 이름만 다르게 적용 -->
<com-counter msg="카운터1"></com-counter>
<com-counter msg="카운터2"></com-counter>
</div>
</body>
<script>
// Vuex의 store 중앙에 state, mutations(setters), getters, actions을 정의함
const store = new Vuex.Store({
// count 값을 상태값으로 정의
state: {
count: 0
},
// mutations는 getters의 대칭되는 setters의 역할을 설정
mutations: {
// 일반적인 함수 형식으로 count 상태값을 증가 시키도록 정의
fnIncData: function (state) {
return state.count++
},
// 함수를 간단하게 1줄로 압축하여 => 연산자를 활용해 count 상태값을 감소 시키도록 정의
fnDecData: state => state.count--
},
getters: {
// 상태값을 반환함
fnGetData(state) {
return state.count;
},
},
actions: {
// 상태값을 감소시키는 함수는 서버단에서 실행한다는 가정을 해봄. 따라서 비동기 실행으로 정의하기 위해 async를 사용하고 매개변수로 commit 객체 전달
async fnDecData({
commit
}, state) {
// 가상으로 만든 원격 API 실행
const result = await api.fnDecrement();
// 원격 API가 성공할 경우에 비로소 fnDecData 함수 실행
if (result == true) commit('fnDecData')
}
}
})
// 타이머를 사용해 1초 후 True 값을 반환하도록 가상으로 원격 서버 API 정의
const api = {
fnDecrement() {
// 비동기 계산을 수행하기 위해 Promise를 사용하고 그에 따른 성공 값을 반환하기 위해 resolve 함수 실행
return new Promise((resolve) => {
setTimeout(() => {
resolve(true);
}, 1000); // 원격서버 느낌을 내기 위해 1초 딜레이 시킴
});
},
};
// com-counter라는 신규 엘리먼트 등록
const comCounter ={
// 카운터 제목은 엘리먼트의 msg 속성값을 받아서 렌더링 함
props: ['msg'],
template: `
<div>
<h2>{{ msg }}</h2>
<p>카운터: {{ fnGetCount }}</p>
<button @click="fnIncCount">+1 증가</button>
<button @click="fnDecCount">-1 감소(원격 API 실행)</button>
<hr>
</div>`,
computed: {
// 카운터 값은 store에서 getters에 접근하여 값을 가져온 후 렌더링함
fnGetCount() {
return store.getters.fnGetData;
}
},
methods: {
// 카운터 증가는 동기실행을 가정하고 직접 store의 mutations에 접근하여 실행
fnIncCount() {
store.commit('fnIncData')
},
//카운터 감소는 원격 서버 API로 비동기 실행을 가정하고 actions에 접근하여 실행
fnDecCount() {
store.dispatch('fnDecData')
}
}
}
// var app = new Vue({
// el: '#app',
// // store 사용을 선언함
// store
// });
const {createApp} =Vue;
createApp({
data(){
return{
}
},
components:{
"com-counter" :comCounter
},
store
}).mount("#app");
</script>
</html>
컴포넌스와 Veux 의 관계 속에서 mutations 을 알기 쉽게 setters 라 이름을 짓지 않고 왜 ? mutations 이라 이름을 지었는가?
mutations 는 사전적 의미로 종의 변화를 뜻합니다. Vuex 의 최초 설계자가 컴포넌트를 살아 있는 생물체로 빗대어 생각했다면 mutations 을 이해하기가 한결 쉬울 것이다.
예를 들어 Vuex 의 데이터를 바꾸면 그것으로 끝나는 게 아니라, Vuex 를 연결하여 사용하는 모든 컴포넌트의 상태가 바뀌는 과정이 마치 돌연변이가 퍼져 나가는 모습과
흡사하다 해서 이런 이름이 붙었습니다.
출처: 프로그레시브 웹앱만들기















댓글 ( 4)
댓글 남기기