-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Labels
๐ Bug๋ฒ๊ทธ๋ฅผ ์์ ํ๊ธฐ ์ํ ์ด์๋ PR๋ฒ๊ทธ๋ฅผ ์์ ํ๊ธฐ ์ํ ์ด์๋ PR
Description
๐ ๋ฌธ์ ์ํฉ
๋ฌธ์ ์ํฉ: #339
๋ฌธ์ ์์ธ
Hydration์ด ์๋ฃ๋๊ธฐ ์ ์ React Query ๋๋ prefetchQuery์์ ๋ณ๊ฒฝ ์ ์บ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ฉด์ ๋ฐ์ดํฐ ๋ถ์ผ์น๊ฐ ๋ฐ์ํจ.
prefetchQuery๊ฐ hydration ๊ณผ์ ์์ ์ต์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฉํ์ง ๋ชปํ์ ๊ฐ๋ฅ์ฑ- React Query๊ฐ hydration ์ด์ ์ ํด๋ผ์ด์ธํธ ์บ์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ ์ฌ์ฉํ์ ๊ฐ๋ฅ์ฑ
โก๏ธ ์ด๋ก ์ธํด ์๋ก๊ณ ์นจ ํ์๋ ์ฐํ๊ธฐ ์ํ(isLiked: true)๊ฐ ๋ฐ์๋์ง ์๊ณ , ๊ธฐ์กด ์ํ(isLiked: false)๊ฐ ์ ์ง๋๋ฉด์ Hydration Error ๋ฐ์.
โ๏ธ ์ฌํ ๊ฐ๋ฅ ์ฌ๋ถ
- ์
- ์๋์ค
๐ป ์ฝ๋
ํด๊ฒฐ ๋ฐฉ๋ฒ
useEffect๋ก Hydration ์๋ฃ ์ฌ๋ถ๋ฅผ ๊ฐ์งํ์ฌ ๋ ๋๋ง ์ง์ฐ
function BookClubMainPage() {
const [isHydrated, setIsHydrated] = useState(false);
useEffect(() => {
setIsHydrated(true);
}, []);
return (
{isLoading || isFetching || !isHydrated ? (
<div className="flex h-[400px] justify-center">
<Loading />
</div>
) : (
<div className="pb-12">
<ClubListSection bookClubs={data} filter={filters} />
</div>
)}
);
}ํด๊ฒฐ ์๋ฆฌ
- SSR ๋จ๊ณ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง๋ง, Hydration ์๋ฃ ์ ๊น์ง๋ ๋ ๋๋งํ์ง ์์ (Loading ํ์)
- Hydration ์๋ฃ ํ (
useEffect์คํ ํ) ์ต์ ๋ฐ์ดํฐ๋ก ๋ ๋๋ง - ์ด๋ก ์ธํด ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ์ํ ๋ถ์ผ์น ํด์
Reactย Query์ ์บ์๊ฐย ์์ ํย ๋ณต์๋ ํ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋์ด hydration error๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
๐๐ป ์ฐธ๊ณ ์๋ฃ
์ด์ฉ ์ ์๋ hydration mismatch๋ฅผ useEffect์์ด ํด๊ฒฐํ๊ธฐ
useEffect | Hooks API Reference
hydrateRoot | React
Server Rendering & Hydration | TanStack Query React Docs
Metadata
Metadata
Assignees
Labels
๐ Bug๋ฒ๊ทธ๋ฅผ ์์ ํ๊ธฐ ์ํ ์ด์๋ PR๋ฒ๊ทธ๋ฅผ ์์ ํ๊ธฐ ์ํ ์ด์๋ PR