[패스트캠퍼스 수강 후기] 프론트엔드 인강 100% 환급 챌린지 48회차 미션 - 35강 Redux 할일 목록 구현

1 minute read

할일 목록 구현

최소한의 UI로 그 전에 useReducer로 구현했었던 todoList를 다시 리덕스로 구현해보자.
TodoItem, TodoList, Todos를 이번엔 한 파일에 구현해볼 것이다. 먼저 components에 Todos를 생성해보자.

Todos.js

import React, { useState } from "react";

function TodoItem({ todo, onToggle }) {
  return (
    <li
      style=
      onClick={() => onToggle(todo.id)}
    >
      {todo.text}
    </li>
  );
}

function TodoList({ todos, onToggle }) {
  return (
    <ul>
      {todos.map((todo) => (
        <TodoItem key={todo.id} todo={todo} onToggle={onToggle} />
      ))}
    </ul>
  );
}

function Todos({ todos, onCreate, onToggle }) {
  const [text, setText] = useState(""); //모든 상태를 리덕스에서 관리할 필요는 없음
  const onChange = (e) => setText(e.target.value);
  const onSubmit = (e) => {
    e.preventDefault();
    onCreate(text); //새로운데이터 등록
    setText(""); //텍스트값 초기화
  };

  return (
    <div>
      <form onSubmit={onSubmit}>
        <input
          value={text}
          onChange={onChange}
          placeholder="할 일을 입력하세요.."
        />
        <button type="submit">등록</button>
      </form>
      <TodoList todos={todos} onToggle={onToggle} />
    </div>
  );
}

export default Todos;

자 이번엔 container에 TodosContainer를 만들어보자.

TodosContainer.js

import React from "react";
import { useSelector, useDispatch } from "react-redux";
import Todos from "../components/Todos";
import { addTodo, toggleTodo } from "../module/todos";

function TodosContainer() {
  const todos = useSelector((state) => state.todos);
  const dispatch = useDispatch();

  const onCreate = (text) => dispatch(addTodo(text), [dispatch]);
  const onToggle = (id) => dispatch(toggleTodo(id), [dispatch]);

  return <Todos todos={todos} onCreate={onCreate} onToggle={onToggle} />;
}

export default TodosContainer;

이제 App.js를 최종 수정하고 돌려보자.

import React from "react";
import CounterContainer from "./containers/CounterContainer";
import TodosContainer from "./containers/TodosContainer";

function App() {
  return (
    <div>
      <CounterContainer />
      <hr />
      <TodosContainer />
    </div>
  );
}

export default App;

이렇게 하고 돌렸는데 에러가 난다. map이 자꾸 펑션이 아니라고.. 으 짜증나..
내일 고쳐보도록 하자…
역시나 이외의 자세하고 정확한 내용은 벨로퍼트의 위키를 참고하길 바라며..
오늘은 여기까지..
시청 영상 35강 08~09까지

수강인증이미지 수강인증이미지 수강인증이미지 프론트엔드 개발 올인원 패키지 with React Online. 👉 https://bit.ly/31Cf1hp

Comments