개발자를 향해...

[초보자를 위한 리덕스 101] #2.0 Vanilla ToDo ~ #2.1 State Mutation 본문

웹 자바스크립트 공부/ReactJS + node.js

[초보자를 위한 리덕스 101] #2.0 Vanilla ToDo ~ #2.1 State Mutation

eugeneHwang1124 2021. 3. 9. 13:36
728x90
반응형

본 글은 노마드코더 님의 [초보자를 위한 리덕스 101]을 수강하며 작성하였습니다.

 

#2.0 Vanilla ToDo

 

To do list를 만들어보자 우선 html의 body부분을 다음과 같이 바꾸어준다.

  <body>
    <h1>To Dos</h1>
    <form>
      <input type="text" placeholder="Write to do" />
      <button>Add</button>
    </form>
    <ul></ul>
  </body>

이제 js 부분을 바꾸어주자.

form, input, ul 을 연결하고 reder에 배열과 action을 넣어주자. 그리고 reducer로 createStore을 해준다.

그리고 버튼을 누르면 이벤트를 발생시켜 입력창의 값을 toDo에 추가하는 onSubmit 함수를 만들어보자.

 

import {createStore} from "redux";

const form = document.querySelector("form");
const input = document.querySelector("input");
const ul = document.querySelector("ul");

const ADD_TODO = "ADD_TODO";
const DELETE_TODO = "DELETE_TODO";

const reducer = (state = [], action) => {
  console.log(action);
  switch(action.type){
    case ADD_TODO:
      return [];
    case DELETE_TODO:
      return [];
    default:
      return state;
  }
};
const store = createStore(reducer);

const onSubmit = e => {
  e.preventDefault();
  const toDo = input.value;
  input.value = "";
  store.dispatch({ type: ADD_TODO, text: toDo });
};

form.addEventListener("submit", onSubmit);

toDo는 input의 텍스트 값에서 할당되는 것이다.

 

#2.1 State Mutation

 

공식 문서를 살펴보면 state는 읽기만 가능하고 Single source of truth이다. 이것은 값 변경을 시도해서는 안된다는 것을 의미한다. State를 바꾸는 방법은 action을 사용하는 것이다. 따라서 값을 배열에 추가하는 것이 아니라 새로운 배열을 선언하고 그 새로운 state를 리턴해야한다. 

const reducer = (state = [], action) => {
  console.log(action);
  switch(action.type){
    case ADD_TODO:
      return [...state, {text:action.text}];
    case DELETE_TODO:
      return [];
    default:
      return state;
  }
};

...state는 배열 대신에 contents를 넣어야한다는 의미이다. 즉 이전 state어레이에 {text:action.text}를 추가해서 새로운 어레이를 만들었다는 것이다. 이제 지우는 것을 해보자.

반응형