๊ด€๋ฆฌ ๋ฉ”๋‰ด

JiYoung Dev ๐Ÿ–ฅ

[React] To-do List ๋งŒ๋“ค๊ธฐ (2023.05.23) ๋ณธ๋ฌธ

full stack/React

[React] To-do List ๋งŒ๋“ค๊ธฐ (2023.05.23)

Shinjio 2023. 5. 24. 00:25

๐ŸŽˆ ๊ตฌ์„ฑํ•˜๊ธฐ

๐Ÿ“– ์ปดํฌ๋„ŒํŠธ

1. TodoList

2. TodoItem

3. TodoInput

 

๐Ÿ“– ์ปจํ…์ŠคํŠธ - TodoContext

์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฐ’

1. todos : ๋‚ด์šฉ, ์™„๋ฃŒ์—ฌ๋ถ€ (๊ฐ์ฒด๋กœ ์ €์žฅ)

2. newTodo : ๋‚ด์šฉ

 

๐ŸŽˆ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ (์ˆœ์„œ)

1) ํ™”๋ฉด์— ์ฒซ Todo ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ

์ปดํฌ๋„ŒํŠธ ์—ฐ๊ฒฐ

์ปจํ…์ŠคํŠธ ์—ฐ๊ฒฐ

์ปจํ…์ŠคํŠธ๋กœ ์‚ฌ์šฉํ•  ๊ฐ’ state๋กœ ์ €์žฅ ํ›„ ์ดˆ๊นƒ๊ฐ’ ์ง€์ •ํ•˜์—ฌ ์ถœ๋ ฅ๋˜๋„๋ก 

 

2) ์ž…๋ ฅ์ฐฝ์— ๊ธ€์”จ๋ฅผ ์ž…๋ ฅํ•˜๋ฉด newTodo์— ์ €์žฅ

handleNewTodo()

 

3) Add ๋ฒ„ํŠผํด๋ฆญ์‹œ Todos์—  newTodo ๊ฐ์ฒด ์ถ”๊ฐ€, input ํ…์ŠคํŠธ ์ฐฝ ๊ณต๋ฐฑ์œผ๋กœ 

addNewTodo()

 

4) add ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์ถ”๊ฐ€๋œ ๊ฐ์ฒด ํ™”๋ฉด์— ๋„์šฐ๊ธฐ

addNewTodo()

 

5) delete ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ ์‚ญ์ œ

deleteTodo()

 

6)  ์ฒดํฌ ๋ฐ•์Šค ์ฒดํฌ๋˜๋ฉด ์ทจ์†Œ์„  ํ‘œ์‹œ

handleCheck()

 

๐ŸŽˆ ์ฝ”๋“œ

๐Ÿ“– App.js

import { useState } from 'react';
import './App.css';
import TodoInput from './components/TodoInput';
import TodoList from './components/TodoList';
import { TodosContext } from './context/TodosContext';

function App() {

  const [ todos, setTodos ] = useState([{text : '์ฒซ Todo', completed : false}])
 
  const [ newTodo, setNewTodo ] = useState('')

  const handleNewTodo = (e)=>{
    setNewTodo(e.target.value);
  }

  const addNewTodo = ()=>{
    setTodos([...todos, {text : newTodo, completed : false}])
    setNewTodo('')
  }

  const deleteTodo = (index)=>{
    const newTodos = [...todos];
    newTodos.splice(index, 1);
    setTodos(newTodos);
  }

  const handleCheck = (index)=>{
    const newTodos = [...todos];
    newTodos[index].completed = !newTodos[index].completed;
    setTodos(newTodos);
  }

  return (
    <TodosContext.Provider value={{todos, setTodos, newTodo, setNewTodo, handleNewTodo, addNewTodo, deleteTodo, handleCheck}} >
      <div>
        <h1>Todo List</h1>
        <TodoList />
        <TodoInput />
      </div>
    </TodosContext.Provider>

  );
}

export default App;

 

๐Ÿ“– TodosContext.js

 

import { createContext } from "react";

export const TodosContext = createContext(null);

 

๐Ÿ“– components 1. TodoList.jsx

 

import React, { useContext } from 'react'
import TodoItem from './TodoItem'
import { TodosContext } from '../context/TodosContext'

const TodoList = () => {

    const { todos } = useContext(TodosContext)

  return (
    <div>
        {todos.map((item, idx)=>(
            <TodoItem key={item.text+idx} index={idx} todo={item}/>
        ))}
    </div>
  )
}

export default TodoList

 

๐Ÿ“– components 2. TodoItem.jsx

 

import React, { useContext } from 'react'
import { TodosContext } from '../context/TodosContext';

const TodoItem = ({index, todo}) => {

    const { deleteTodo, handleCheck } = useContext(TodosContext);

  return (
    <div>
        <input id="todo-item" type="checkbox" onChange={()=>{handleCheck(index)}} />
        <lable htmlFor="todo-item" style={{
            textDecoration: todo.completed ? "line-through" : "none"
        }}>{todo.text}</lable>
        <button onClick={()=>{deleteTodo(index)}}>Delete</button>
    </div>
  )
}

export default TodoItem

 

๐Ÿ“– components 3. TodoInput.jsx

 

import React, { useContext } from 'react'
import { TodosContext } from '../context/TodosContext'

const TodoInput = () => {

    const {handleNewTodo, addNewTodo, newTodo} = useContext(TodosContext)

  return (
    <div>
        <input type="text" onChange={handleNewTodo} value={newTodo}/>
        <button onClick={addNewTodo}>Add</button>
    </div>
  )
}

export default TodoInput


๐ŸŽˆ ์ฐธ๊ณ ์‚ฌํ•ญ

 

- handleTodoAddition ์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑ 
   => ๊ธฐ์กด์— ์žˆ๋˜ todos ์— newTodos ๋ผ๋Š” ๊ฐ’์„ ์ถ”๊ฐ€ 
   => ** state๋ฅผ ๋ˆ„์ ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•! 
   => const [txt, setTxt] = useState("ํ•˜์ด") 
      Q. ํ•˜์ด => ๋ฐ”์ด 
      setTxt("๋ฐ”์ด"); 
      
      Q. ํ•˜์ด => ํ•˜์ดํ•˜์ด 
      setTxt([...txt, "ํ•˜์ด"]) 

   => ๊ธฐ์กด์— ์žˆ๋˜ todos์— newTodo ๋ฅผ ๋”ํ•ด๋ณด๋ฉด? 
   setTodos([...todos, {text : newTodo , completed : false }])

 

/* 
    [์—๋Ÿฌ ์ฝ์–ด๋ณด๊ธฐ!]
    
    useState is not defined 
    useContext is not defined 
    =>  import ์•ˆํ•ด์ค˜์„œ ๋‚˜๋Š” ์˜ค๋ฅ˜ 

    ck is no defined 
    => ck ๋ผ๋Š” ํ•จ์ˆ˜, ํ˜น์€ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์ง€ X 
    
    React Hook "useState" cannot be called at the top level. 
    => use ~ ๋ฆฌ์•กํŠธ ํ›…์€ ๋ฐ˜๋“œ์‹œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ์ž‘์„ฑ 
*/

'full stack > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] Lifecycle (2023.05.24)  (0) 2023.05.24
[React] useRef (2023.05.24)  (0) 2023.05.24
[React] context API (2023.05.22)  (0) 2023.05.22
[React] React ๋ณต์Šต (๊ฐœ๋… ~ context API๊นŒ์ง€) (2023.05.22)  (0) 2023.05.22
[React] Component, Props, State (2023.05.16)  (0) 2023.05.16