✅ 과제1: CRUD 중 하나의 기능을 구현하고 주석으로 설명하기
제가 여기서는 Update
기능(= 완료 상태 토글)을 선택해서,
함수 내부를 하나하나 주석으로 설명해드리겠습니다.
📄 완료 상태 토글 함수 (handleToggle
)
const handleToggle = (id) => {
// 1. 기존 todos 배열을 map으로 순회하면서
setTodos(
todos.map((todo) =>
// 2. 현재 순회 중인 todo의 id가 인자로 받은 id와 같으면
todo.id === id
// 3. isDone 상태를 반전시킨 새로운 객체를 반환 (true <-> false)
? { ...todo, isDone: !todo.isDone }
// 4. 그렇지 않으면 기존 객체 그대로 유지
: todo
)
);
};
🔍 핵심 요약
동작 | 설명 |
---|---|
map() |
배열의 각 항목을 순회 |
todo.id === id |
토글하려는 항목인지 확인 |
{ ...todo, isDone: !todo.isDone } |
기존 객체 복사 + isDone 만 반전 |
setTodos(...) |
새로운 배열을 상태로 설정 (불변성 유지 필수) |
💡 보너스 과제 (선택)
완료된 항목만 삭제하기
도 도전해볼 수 있습니다:
const handleDeleteDone = () => {
// 완료된 항목만 걸러내서 삭제
setTodos(todos.filter(todo => !todo.isDone));
};
✅ 과제2: CRUD 중 하나의 기능을 구현하고 주석으로 설명하기
📍 목표
- 입력창에 아무것도 입력하지 않거나, 공백만 입력된 경우에는
추가
버튼을 비활성화 - 사용자 경험(UX) 향상: 실수로 빈 할 일을 추가하지 않도록 방지
📄 적용 위치: TodoForm.jsx
import { useTodoContext } from '../context/TodoContext';
function TodoForm() {
const { text, setText, handleAdd } = useTodoContext();
const handleKeyDown = (e) => {
if (e.key === 'Enter') handleAdd();
};
// ✅ 입력값에서 공백 제거 후 비었는지 확인
const isDisabled = text.trim() === '';
return (
<div style={{ marginBottom: '20px' }}>
<input type="text"
value={text}
onChange={(e) => setText(e.target.value)}
onKeyDown={handleKeyDown}
placeholder="할 일을 입력하세요"
/>
{/* ✅ 조건부 disabled 속성 적용 */}
<button onClick={handleAdd} disabled={isDisabled}>
추가
</button>
</div>
);
}
export default TodoForm;
✅ 요약
구현 요소 | 설명 |
---|---|
text.trim() |
입력값 앞뒤 공백 제거 |
text.trim() === '' |
내용이 없을 경우 버튼 비활성화 |
<button disabled={조건}> |
조건이 true면 버튼 비활성화됨 |
🧪 사용 예
입력값 | 버튼 상태 |
---|---|
"" (빈 문자열) |
❌ 비활성화 |
" " (공백만 있음) |
❌ 비활성화 |
"일정 정리" |
✅ 활성화 |
.
💬 댓글
※ 로그인 후 댓글을 작성할 수 있습니다.