useEffect
와 useMemo
와 같은 훅의 동작을 최적화useState
와 같은 훅 사용
function UpdateName() {
const [name, setName] = useState("");
const [error, setError] = useState(null);
const [isPending, setIsPending] = useState(false);
const handleSubmit = async() => {
setIsPending(true);
try {
await updateName(name);
... // 성공 시
} catch (error) {
setError(error);
} finally {
setIsPending(false);
}
};
...
};
useTransition
, useActionState
사용
function UpdateName() {
const [name, setName] = useState("");
const [error, startTransition, isPending] = useActionState();
const handleSubmit = async() => {
startTransition(async () => {
try{
await updateName(name);
...
} catch (error) {
return error;
// useActionState는 error를 적절하게 처리
}
});
};
...
}
function ChangeNameForm({ onSubmit }) {
const [name, setName] = useState("");
const handleSubmit = (event) => {
event.preventDefault();
onSubmit(name);
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={name}
onChange={(event) => setName(event.target.value)}
/>
<button type="submit">Submit</button>
</form>
);
}
React 19
- 비동기 처리 단순화
- 자동으로 상태 관리
function ChangeNameForm() {
const [error, submitAction, isPending] = useActionState(
async (formData) => {
const error = await updateName(formData.get("name"));
if (error) return error;
redirect("/path");
}
);
return (
<form action={submitAction}>
<input type="text" name="name" />
<button type="submit" disabled={isPending}>Submit</button>
{error && <p>{error}</p>}
</form>
);
}
React 18
- 폼의 제출 상태를 관리하기 위해 useState
사용
- 폼의 pending 상태 직접 관리 필요
function LoginForm() {
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const [isSubmitting, setIsSubmitting] = useState(false);
const handleSubmit = async (event) => {
event.preventDefault();
setIsSubmitting(true);
await loginUser(username, password); // 로그인 함수를 비동기로 호출
setIsSubmitting(false);
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={username}
onChange={(e) => setUsername(e.target.value)}
/>
<input
type="password"
value={password}
onChange={(e) => setPassword(e.target.value)}
/>
<button type="submit" disabled={isSubmitting}>Login</button>
</form>
);
}
React 19
- useFormStatus
사용
- 폼의 pending 상태 자동 감지
- 개발자가 이를 수동으로 설정할 필요 X
- ContextProvider처럼 부모의 <form>
상태를 읽음
import { useFormStatus } from 'react-dom';
function LoginForm() {
const { pending } = useFormStatus();
return (
<form onSubmit={handleLogin}>
<input type="text" name="username" />
<input type="password" name="password" />
<button type="submit" disabled={pending}>Login</button>
</form>
);
}
function ChangeName({ currentName, onUpdateName }) {
const [optimisticName, setOptimisticName] = useState(currentName);
const [isUpdating, setIsUpdating] = useState(false);
const handleSubmit = async (event) => {
event.preventDefault();
const newName = event.target.name.value; // 폼에서 새 이름을 가져오기
setOptimisticName(newName); // 사용자 인터페이스에 즉시 변경을 반영
setIsUpdating(true); // 업데이트 진행 중 상태를 설정
try {
const updatedName = await updateName(newName); // API 호출을 통해 이름 업데이트
onUpdateName(updatedName); // 부모 컴포넌트에 업데이트를 알리기
setIsUpdating(false); // 업데이트 완료 상태 설정
} catch (error) {
console.error("Failed to update name:", error);
setOptimisticName(currentName); // 오류가 발생하면 원래 이름으로 롤백
setIsUpdating(false); // 업데이트 완료 상태 설정
}
};
return (
<form onSubmit={handleSubmit}>
<p>Your name is: {optimisticName}</p>
<p>
<label>Change Name:</label>
<input
type="text"
name="name"
value={optimisticName}
onChange={(e) => setOptimisticName(e.target.value)}
disabled={isUpdating || currentName !== optimisticName}
/>
<button type="submit" disabled={isUpdating}>Update</button>
</p>
</form>
);
}
useOptimistic
사용function ChangeName({currentName, onUpdateName}) {
const [optimisticName, setOptimisticName] = useOptimistic(currentName);
const submitAction = async formData => {
const newName = formData.get("name");
setOptimisticName(newName);
const updatedName = await updateName(newName);
onUpdateName(updatedName);
};
return (
<form action={submitAction}>
<p>Your name is: {optimisticName}</p>
<p>
<label>Change Name:</label>
<input
type="text"
name="name"
disabled={currentName !== optimisticName}
/>
</p>
</form>
);
}
스장님 얘 아직 작성 안했어요~