기존 코드:
const handleAddTask = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
const taskValue = e.currentTarget.task.value.trim();
if (!taskValue) {
alert('태스크를 입력해주세요.');
return;
}
if (curProjectId === undefined) {
alert('선택된 프로젝트가 없습니다.');
return;
}
setProjects((prevProjects) => {
const projectIndex = prevProjects.findIndex(
(project) => project.id === curProjectId
);
if (projectIndex === -1) {
alert('선택된 프로젝트를 찾을 수 없습니다.');
return prevProjects;
}
const newTaskId =
prevProjects[projectIndex].tasks.reduce(
(maxId, task) => Math.max(maxId, task.id),
0
) + 1;
const newTask = { id: newTaskId, task: taskValue };
const updatedProjects = [...prevProjects];
updatedProjects[projectIndex].tasks = [
...updatedProjects[projectIndex].tasks,
newTask,
];
return updatedProjects; // setProjects를 다시 호출하지 않고 업데이트된 배열을 반환
});
};
매개변수를 이벤트로 받았는데
gtp 01 mini 모델에서 코드의 개선을 요구했다
개선 사항은
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault();
if (task.trim()) {
onAddTask(task);
setTask('');
} else {
alert('태스크를 입력해주세요.');
}
};
위와 같이 핸들러를 만들어 하위 컴포넌트에서 값 자체를 보내는 것인데
제시해준 이유와 장점을 보니 바꾸는 게 맞는 것 같다
결론
제시한 코드는 Controlled Components 패턴을 올바르게 따르고 있습니다. React.FormEvent<HTMLFormElement>가 넘어오는 값이 DOM 요소임에도 불구하고, 입력 필드의 값을 React 상태로 관리하고 있기 때문에 Controlled Components로 간주됩니다. Controlled Components를 사용함으로써 다음과 같은 이점을 누릴 수 있습니다:
- 타입 안전성 강화: TypeScript를 통해 명확한 타입 검증을 수행할 수 있습니다.
form이벤트로 받아오게 되면 TypeScript를 통한 명확한 검증이 안되는데 맞다.
- 유지보수성과 확장성 향상: 상태 관리가 중앙집중화되어 있어, 폼 구조 변경 시 유연하게 대응할 수 있습니다.
이 부분도 처음에 무슨 소리인줄 몰랐는데 form 객체의 name을 바꿀 경우 어떤 대응도 하지 못한채 런타임에서 에러를 맞이 할 수 있다. 타입스크립트에서 에러관리가 안되는 것은 곡 피해야 한다
- 일관된 데이터 흐름: 모든 폼 데이터가 React 상태를 통해 흐르므로 데이터의 일관성이 유지됩니다.
- 실시간 피드백 및 검증: 사용자가 입력할 때마다 상태가 업데이트되어 실시간으로 입력값을 검증하고 피드백을 제공할 수 있습니다.
gtp o1부터 생각을 하기 시작했다는데 상상 이상으로 성능이 좋다
'개발 > 기록' 카테고리의 다른 글
| Modal을 만들 때 상태를 이용하는 법과 forwardRef, useImperativeHandle 을 사용하는 것의 차 (3) | 2024.09.20 |
|---|---|
| !와 as HTMLElement의 차이 (0) | 2024.09.19 |
| css로 영문 UpperCase하는 것과 직접 대문자로 입력하는 것의 차이 (1) | 2024.09.15 |
| current target과 target의 차이점 (3) | 2024.09.13 |
| 기존 react 프로젝트 typescript 프로젝트로 만들기 (0) | 2024.08.29 |