'use client';
const ProfileEditPage = () => {
const params = useParams();
const workspaceUserId = params.targetWorkspaceUserId as string;
const { workspaceUser, updateWorkspaceUser } = useWorkspaceUser(workspaceUserId);
const { register, handleSubmit, formState } = useForm({
mode: 'onChange',
defaultValues: {
name: workspaceUser?.name,
email: workspaceUser?.email,
phone: workspaceUser?.phone
}
});
const onSubmit = (value: FieldValues) => {
console.log(value);
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<div className="flex flex-col border-2 border-black">
<label htmlFor="name">이름</label>
<input {...register('name')} type="text" />
</div>
<div className="flex flex-col border-2 border-black">
<label>활동 상태</label>
<input />
</div>
<div className="flex flex-col border-2 border-black">
<label>이메일</label>
<input {...register('email')} type="email" />
</div>
<div className="flex flex-col border-2 border-black">
<label>전화번호</label>
<input {...register('phone')} type="text" />
</div>
<button>수정 완료하기</button>
</form>
);
};
export default ProfileEditPage;

위와 같은 현상이 발생하는 이유는 코드에 console.log로 데이터를 확인해보면 더 명확히 알 수 있다.
위와 같은 현상이 발생하는 이유
클라이언트 렌더링 어플리케이션에서는 사용자에게 화면에 콘텐츠를 표시하기 전에 최소 3번의 서버 왕복(roundtrips)이 필요하다.
1. |-> Markup (내용 없이 - 비어있는 index.html)
2. |-> JS
3. |-> Query
즉, JS를 가져올 때 Query에 대한 정보가 없기 때문에 undefined를 반환하고, Query를 가져올 때야 비로소 데이터에 대한 정보를 반환 할 수 있게 되는 것이다.
useEffect(() => {
setImageURL(profileImage);
setName(setEmptyStr(workspaceName));
setState(setEmptyStr(workspaceState));
setEmail(setEmptyStr(workspaceEmail));
setPhone(setEmptyStr(workspacePhone));
setIsOpen(workspaceIsOpen ? workspaceIsOpen : false);
}, [profileImage, workspaceName, workspaceEmail, workspacePhone, workspaceState, workspaceIsOpen]);
1. |-> Markup (내용이 채워져있고, data가 초기화 되어있음)
2. |-> JS
dehydrate(data를 json 형태의 정적 데이터로 변경) 시켜 마크업에 포함(embed) 시킨다.import { dehydrate, HydrationBoundary, QueryClient } from '@tanstack/react-query';
interface ProfileParallelLayoutProps {
home: React.ReactNode;
params: {
targetWorkspaceUserId: string;
};
}
const ProfileParallelLayout = async ({
children,
home,
params
}: StrictPropsWithChildren<ProfileParallelLayoutProps>) => {
const queryClient = new QueryClient();
await queryClient.prefetchQuery({
queryKey: ['workspaceUser', params.targetWorkspaceUserId],
queryFn: () => api.workspaceUser.getWorkspaceUser(params.targetWorkspaceUserId)
});
return (
<>
...
<HydrationBoundary state={dehydrate(queryClient)}>{children}</HydrationBoundary>
...
</>
);
};
export default ProfileParallelLayout;
