[React] Redux - toolkit 사용해보기 - todo

2022. 7. 23. 18:15·React/실험실
반응형

0. 들어가며, 

기본적으로 Redux와 Redux - Toolkit에 대한 이론을 공부한 뒤, 작성하였습니다. 

[React] Redux - 기본편

[React] Redux - toolkit편

 

1. 프로젝트 세팅

yarn add @reduxjs/toolkit react-redux

redux를 사용하기 위해서 toolkit과 react-redux만 추가로 설치해준다. 

 

2. 개발

1. Todos Reducer

import { createSlice } from "@reduxjs/toolkit";

const initialState = {
  todos: [],
};

export const todoSlice = createSlice({
  name: "todos",
  initialState,
  reducers: {
    addTodos: (state, action) => {
      state.todos.push({ text: action.payload, done: false });
    },
    removeTodos: (state, action) => {
      state.todos.splice(action.payload, 1);
    },
    toggleTodos: (state, action) => {
      state.todos[action.payload].done = !state.todos[action.payload].done;
    },
  },
});

export const { addTodos, removeTodos, toggleTodos } = todoSlice.actions;
export default todoSlice.reducer;

추가, 삭제, 완료 기능을 만들기 위해서 createSlice를 사용했다. 

 

만약 예전 버전의 Redux를 사용했다면, 

const ADD_TODOS = 'todos/TODOS_ADD_TODOS';

export const addTodos = createAction(ADD_TODOS, ({key, value}) => ({ 
    key,
    value,
}));

// ...

const todos = handleActions({
    [ADD_TODOS]: // ...
})

더 길어지고 몇가지 과정을 거쳐야 했겠지만, 그부분을 하나로 간단하게 작업할 수 있다. 

 

또한 내부에 immer가 포함되어 있기 때문에 

state.todos[action.payload].done = !state.todos[action.payload].done;

불변 업데이트가 이루어진다. 

 

2. store 

import { configureStore } from "@reduxjs/toolkit";
import todos from "./todos";

export default configureStore({
  reducer: {
    todos,
  },
});

createStore 대신 사용하는 방식으로 reducer들을 자동으로 하나의 Root Reducer로 합쳐준다. 

 

3. Provider

import React from "react";
import ReactDOM from "react-dom/client";
import { Provider } from "react-redux";
import App from "./App";
import store from "./modules";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <Provider store={store}>
    <App />
  </Provider>
);

만들어둔 store를 src/index.js에서 Provider를 통해서 적용한다. 

 

4. 화면에 나타내기

import { useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { addTodos, removeTodos, toggleTodos } from "./modules/todos";

const TodoItem = ({ todo, onToggleHandler, onRemoveHandler }) => {
  return (
    <div>
      <input
        type="checkbox"
        onClick={() => onToggleHandler()}
        checked={todo.done}
        readOnly={true}
      />
      <span style={{ textDecoration: todo.done ? "line-through" : "none" }}>
        {todo.text}
      </span>
      <button onClick={() => onRemoveHandler()}>삭제</button>
    </div>
  );
};

function App() {
  const { todos } = useSelector((state) => state.todos);

  const [inputText, setInputText] = useState("");

  const dispatch = useDispatch();

  const onSubmitHandler = (e) => {
    e.preventDefault();
    dispatch(addTodos(inputText));
    setInputText("");
  };

  console.log(todos);

  return (
    <div>
      <form onSubmit={onSubmitHandler}>
        <input
          value={inputText}
          onChange={(e) => setInputText(e.target.value)}
        />
        <button type="submit">추가</button>
      </form>

      <hr />

      {todos?.map((data, idx) => {
        return (
          <TodoItem
            key={idx}
            todo={data}
            onToggleHandler={() => {
              dispatch(toggleTodos(idx));
            }}
            onRemoveHandler={() => dispatch(removeTodos(idx))}
          />
        );
      })}
    </div>
  );
}

export default App;

 

5. 깃허브

https://github.com/SeoJaeWan/react-redux-toolkit

 

GitHub - SeoJaeWan/react-redux-toolkit

Contribute to SeoJaeWan/react-redux-toolkit development by creating an account on GitHub.

github.com

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'React > 실험실' 카테고리의 다른 글

[React] 나만의 리액트 만들기 - 2 - 컴포넌트  (0) 2022.09.30
[React] 나만의 리액트 만들기 - 1 - JSX 그리고 ReactDOM  (1) 2022.09.29
[React] 실시간 채팅 만들기  (2) 2022.06.25
[React] MobX - 비동기화  (0) 2022.05.30
[React] Webpack - 심화  (3) 2022.04.28
'React/실험실' 카테고리의 다른 글
  • [React] 나만의 리액트 만들기 - 2 - 컴포넌트
  • [React] 나만의 리액트 만들기 - 1 - JSX 그리고 ReactDOM
  • [React] 실시간 채팅 만들기
  • [React] MobX - 비동기화
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    next.js
    덤프
    프로그래머스
    webpack
    네트워크
    타일러영어
    바질 키우기
    리액트
    javascript
    네이버 부스트캠프
    식물
    Node.js
    CSS
    자바스크립트
    다이소
    CCNA
    타입스크립트
    ReactNative
    알고리즘
    react
    영어회화
    영어독학
    리얼학습일기
    Babel
    redux
    바질
    ChatGPT
    리얼클래스
    typescript
    Docker
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] Redux - toolkit 사용해보기 - todo
상단으로

티스토리툴바