๋ฆฌ์กํธ๋ก ํฌ๋ ๋ฆฌ์คํธ ๋ง๋ค๊ธฐ
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));
}
};
์ค๋๋ง์ '์ํ'์ ๋ํด ๋ง์ง๊ฒ ๋๋๊น ๋ค์ ์ฒ์ ํ ๋๋ก ๋์๊ฐ ๋๋์ด๋ผ ๋ ์๋ชจ๋ ์๊ฐ์ด ๋ง์๋ค ๐...
๋ด์ผ์ ๋ค์ ์ฒ์๋ถํฐ ๊ฐ๋
์ ๋ฆฌ๋ฅผ ํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ์ผ ํ ๋ฏํ๋ค.
'๐ Studying > ๐ TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React์ Redux๋ฅผ ์ด์ฉํ ํฌ๋๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์ด๋ณด๋ฉฐ (0) | 2022.12.15 |
---|---|
React onClick์ ํจ์ ๋๊ธธ ๋์ ๋งค๊ฐ๋ณ์ ์ฒ๋ฆฌ (1) | 2022.12.13 |
JS ํ์ด์ด๋ฒ ์ด์ค DB ๋ฐ์ดํฐ count ์ง๊ณํด์ ๋ถ๋ฌ์ค๊ธฐ (1) | 2022.11.24 |
JS ํ์ด์ด๋ฒ ์ด์ค์์ ์ค์๊ฐ์ผ๋ก DB ๋ฐ์ํ๊ธฐ (0) | 2022.11.23 |
JS SPA์์ผ๋ก ์ด๋ฒคํธ ํจ์ ๋ง๋ค๊ธฐ (0) | 2022.11.21 |
Comment