으악, 한번 포스팅을 날려버렸다. 하필이면 제일 길게 쓴 포스팅을...T.T
하지만 기본 골자는, 복잡하고 각 파일에 흝어져있는 메소드와, data props와 v-bind: 형식을
깔끔하게 store.js에 넣고, 출력할 페이지에서 간편하게 this.$store. ~ 으로 꺼내 쓸수 있다는점!
Vuex로 todolist를 mutation과 action으로 리팩토링하기!
2022/09/12
1.Vuex로 mutation사용하기,
=>state값을 변경할 수 있는 방법! (꼭 mutation으로 변경해야함!)
=>첫번쨰 인자로 state를 가져오기 떄문!
=>commit() 으로 사용!
=>왜 사용해야하냐면, js코드들을 store.js에서 한눈에 모아볼 수 있고! 각각의 파일들이 깔끔하게 리팩토링
===store.js 파일에서 ===
state: { num:100 },
mutations: {
returnNumbers(state){
return state.num
},
multipleNumbers(state, anotherNum){
return state.num + anotherNum;
}
}
=>num은 100이라 선언하고, mutations에서 각각의 함수 2개,
두번째 함수에서는 기존의 sate랑 다른 숫자 기입 가능하도록 선언
===App.vue파일에서 ===
this.$store.commit('returnNumbers');
this.$store.commit('mutipleNumbers',30);
=>commit();형식으로 ()안에 ''함수와 값을 넣어주기
multipleNumber은 state랑, 숫자를 넣어주기로 store.js에서 선언해서 값 2개 넣기
mutation은 객체화시켜서 인자(payload)를 전달 가능
===특히, App.vue에서 여러 키밸류들을 주고 싶다면, {키값명1:키값1, 키값명2:키값..} 이런식으로 넘겨 줄 수 있음!
===store.js에서===
state: { newNum: 100},
mutations:{
changeState(state, playload){
console.log(payload.str);
retrun state.newNum += payload.num;
}
}
===App.vue에서===]
this.$state.commit)('changeState',{
str:'passed form payload',
num:20
});
2.todolist 파일에서 mutation사용하기
App.vue에 있는 메소드들을 mutation으로 변경 가능함
기본골자는,,
1.데이터를 처음 주는 파일에서 메소드를 store.js로 옮김
2.store.js에서 mutation을선언, state로 인자를 사용하고, payload로 사용
(this. > state.으로 변경)
3.데이터를 받는 파일에서 this.$store.commit();형태로!
2-1.메소드를 store.js로 옮기고 인자 변경해주기
mutations: {
addOneItem(state, todoItem) {
const obj = { completed: false, item: todoItem };
localStorage.setItem(todoItem, JSON.stringify(obj));
state.todoItems.push(obj);
},
removeOneItem(state,payload){
localStorage.removeItem(payload.todoItem.item);
state.todoItems.splice(payload.index, 1);
},
toggleOneItem(state,payload){
state.todoItems[payload.index].completed = !state.todoItems[payload.index]
.completed;
localStorage.removeItem(payload.todoItem.item);
localStorage.setItem(
payload.todoItem.item,
JSON.stringify(payload.todoItem)
);
},
clearAllItem(state){
localStorage.clear();
state.todoItems = [];
}
3. App.vue에서 메소드를 this.$store.commit();으로 변경
{}로 인자 여러개일떄 넣어줄 수 있음!
(*//가 앞에 있 는 라인은 리팩토링 이전의 코디임!)
export default {
methods : {
removeTodo(todoItem, index){
//this.$emit('removeItem',todoItem, index);
this.$store.commit('removeOneItem',{todoItem, index});
},
toggleComplete(todoItem, ){
//this.$emit('toggleItem',todoItem,index);
this.$store.commit(toggleOneItem),{tosoItem, index};
}
}
}
4.App.vue의 태그들은 깔끔해 졌다!
<div id="app">
<TodoHeader></TodoHeader>
<TodoInput></TodoInput>
<TodoList></TodoList>
<TodoFooter ></TodoFooter>
</div>
5.action은 dispatch로 호출함!
=>ES6 Pomise와 async의 비동기화를 action으로 처리함!
(*비동기화란, 하나의 연산이 다 실행되기전에 할수 있는 다른 연산을 실행하는것)
1.state를 어떤 콤포넌트에서, 호출 시점을 확인하기 위해서
2.mutation으로 동기적인 요소 처리
3.action으로 비동기로 처리!
***만약 store.js의 state를 접근하는데, 여러 콤포넌트파일에서 시간차로 접근한다면 어려움,
그래서 actions로 비동기 로직 처리
=>store.js에 있는 action을 호출시키기 위해선 예) this.$store.dispatch(''); 로 사용
===store.js파일에서 mutaions과 action을 정의===
mutations:{
addTime(state){
state.time++
},}
=>state인자를 addTime이라는 메소드로 정의, 위의 time이라는 state가 생략되어있지만 위에 있음!
===action으로 mutations을 정의===
actions:{
DelayAddTime(context){
setTimeout(() => context.commit('addTime'),3000);
}
}
=> 삼초마다 tim
=== App.vue파일에선===
methods:{
increaseTime(){
this.$store.dispatch('delayAddTime');
}
}
=>메소드 실행, mutations은 dispatch로!delayAddTimeㅣ를 실행시키면
store.js에서 DelayAddTime을 실행시키고 3초정도 딜래이 되어서 addTime을 실행
아무튼 store.js에서 사용되는 state를 추적하기 위해 동기화, 비동기화를
잘 구분해서 써야한다!
'괴발개발' 카테고리의 다른 글
todolist 프로젝트 구조화/모듈화하기! (0) | 2022.09.14 |
---|---|
Vuex, 유연한 사용이 가능한 헬퍼함수 학습하기 (0) | 2022.09.14 |
Vuex로 어플의 복잡한 콤포넌트 관리하기 (Vuex설치, state, getter!) (0) | 2022.09.11 |
const, let 리팩토링하고, 화살표 함수, Enhanced object literals, modules, export dafault (0) | 2022.09.10 |
Vue.js에서 ES6사용하기! - babel, const와let (0) | 2022.09.08 |