React ํˆฌ๋‘๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
728x90

๋ฆฌ์•กํŠธ๋กœ ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ

useState์™€ useRef ํ›… ๋งŒ์„ ์ด์šฉํ•ด์„œ ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๋ฐฐํฌ๋œ ์ฃผ์†Œ๋Š” ์•„๋ž˜.

 

https://todolist-phi-rouge.vercel.app/

 

๋‹ค๋ฅธ ํ›…์€ ์ด์šฉํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ๊ณ ์นจ์„ ํ–ˆ์„ ๋•Œ ์œ ์ง€๊ฐ€ ๋œ๋‹ค๊ฑฐ๋‚˜.. ์ด๋Ÿฐ ๋ถ€๋ถ„์€ ์•ˆ๋˜์ง€๋งŒ!

ํ•œ๋™์•ˆ ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ ํ•˜๋‹ค๊ฐ€ ๋ฆฌ์•กํŠธ๋กœ ๋‹ค์‹œ ๋Œ์•„์˜ค๋‹ˆ State๋ž€ ๋…€์„์ด ์ƒˆ๋กญ๊ฒŒ ๋‹ค๊ฐ€์™€์„œ

ํˆฌ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๋ฉฐ ์ข€ ํ—ค๋งจ ๋ถ€๋ถ„์„ ์ •๋ฆฌํ•ด๋ณด๋ ค ํ•œ๋‹ค.

 

 

ํˆฌ๋‘ ๊ฐ์ฒด์— id๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ

ํˆฌ๋‘๋งˆ๋‹ค ๊ฐ๊ฐ์˜ ์•„์ด๋””๋ฅผ ๋‹ฌ์•„์ฃผ๊ธฐ ์œ„ํ•ด์„œ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ, useRef ํ›…์„ ์ด์šฉํ•ด๋ณด์•˜๋‹ค.

useRef()

useRef๋Š” current๋ผ๋Š” ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์ด๋•Œ ์ธ์ž๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด, ์ด ๊ฐ’์„ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ current์— ํ• ๋‹นํ•œ๋‹ค.

current ์†์„ฑ์€ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์œ ์‹ค๋˜์ง€ ์•Š๋Š”๋‹ค!

 

์•”ํŠผ ์ด current ๊ฐ’์„ ์ด์šฉํ•ด์„œ ๊ฐ์ฒด๋งˆ๋‹ค ์•„์ด๋””๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.

const newTodo = {
      id: id.current,
      title: title,
      body: text,
      isDone: false,
    };

 

 

๋ Œ๋”๋ง ํ•˜๊ธฐ

์ง„ํ–‰์ค‘์ธ ํˆฌ๋‘, ์™„๋ฃŒ๋œ ํˆฌ๋‘๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ๋ Œ๋”๋ง ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— isDone์˜ ๊ฐ’์— ๋”ฐ๋ผ์„œ ํ•„ํ„ฐ๋ง๋œ ๋ฐฐ์—ด์„ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค.
์ฐธ๊ณ ๋กœ ์ด TodoList ์ปดํฌ๋„ŒํŠธ๋Š” ์ง„ํ–‰ ์ค‘, ์™„๋ฃŒ ์ค‘ ๋‘˜ ๋‹ค ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ์žฌ์‚ฌ์šฉํ–ˆ๋‹ค!

<TodoList
    todos={todos.filter((todo) => !todo.isDone)}
    listTitle={'๐Ÿ”ฅ ์ง„ํ–‰์ค‘ ๐Ÿ”ฅ'}
    onToggle={onToggleHandler}
    onDelete={onDeleteHandler}
/>
<TodoList
    todos={todos.filter((todo) => todo.isDone)}
    listTitle={'๐ŸŽ‰ ์™„๋ฃŒ ๐ŸŽ‰'}
    onToggle={onToggleHandler}
    onDelete={onDeleteHandler}
/>

 

 

TodoList ์ปดํฌ๋„ŒํŠธ์—์„œ map ๋ฉ”์„œ๋“œ๋กœ ๋ Œ๋”๋ง ํ›„์— isDone ๊ฐ’์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ฐฐ์ง€๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.
์•„๋ž˜๋Š” ์ฝ”๋“œ์˜ ์ผ๋ถ€!.. react-icons ํŒจํ‚ค์ง€๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

const TodoItem = ({ title, body, id, isDone, onToggle, onDelete }) => {
  return (
    <TodoItemBlock key={id} isDone={isDone}>
      {isDone && <BsPatchCheckFill size={32} color={'#10c7a2'} cursor={'pointer'} onClick={() => onToggle(id)} />}
      {!isDone && <BsPatchCheckFill size={32} color={'#ddd'} cursor={'pointer'} onClick={() => onToggle(id)} />}
    </TodoItemBlock>
  );
};

 

 

์ง„ํ–‰ ์ค‘, ์™„๋ฃŒ ์ค‘ ํ† ๊ธ€

์ง„ํ–‰ ์—ฌ๋ถ€ ํ† ๊ธ€์€ ํด๋ฆญํ•œ ์•„์ดํ…œ์˜ id๊ฐ’์„ ๋ฐ›์•„์™€ ํ•ด๋‹น ๊ฐ์ฒด์˜ isDone์„ ๋ณ€๊ฒฝํ•ด์„œ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์œผ๋กœ.
์ˆ˜์ • ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ๋‹ค๋ฉด ๋น„์Šทํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 const onToggleHandler = (id) => {
    setTodos(
      todos.map((todo) =>
        todo.id === id
          ? {
              ...todo,
              isDone: !todo.isDone,
            }
          : todo
      )
    );
  };

 

 

์‚ญ์ œ

์‚ญ์ œํ•˜๊ธฐ ๋˜ํ•œ id๊ฐ’์„ ๋ฐ›์•„์™€์„œ ํ•ด๋‹น ์•„์ดํ…œ์„ ๊ฑฐ๋ฅด๋Š” ๊ฒƒ์œผ๋กœ ์ƒํƒœ ๋ณ€๊ฒฝ!

  const onDeleteHandler = (id) => {
    if (window.confirm('ํ•ด๋‹น ํˆฌ๋‘๋ฅผ ์ •๋ง๋กœ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?')){
        setTodos(todos.filter((todo) => todo.id !== id));
    }
  };

์˜ค๋žœ๋งŒ์— '์ƒํƒœ'์— ๋Œ€ํ•ด ๋งŒ์ง€๊ฒŒ ๋˜๋‹ˆ๊นŒ ๋‹ค์‹œ ์ฒ˜์Œ ํ•  ๋•Œ๋กœ ๋Œ์•„๊ฐ„ ๋Š๋‚Œ์ด๋ผ ๋” ์†Œ๋ชจ๋œ ์‹œ๊ฐ„์ด ๋งŽ์•˜๋‹ค ๐Ÿ˜‡...
๋‚ด์ผ์€ ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฐœ๋… ์ •๋ฆฌ๋ฅผ ํ•ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์•ผ ํ•  ๋“ฏํ•˜๋‹ค.

 

 

 

728x90