// /src/app/(with-searchbar)/search/loading.tsx
const Loading = () => {
return (
<div>Loading...</div>
)
}
export default Loading
loading.tsx
파일 추가.async function SearchResult() {
const response = await fetch(``, {
cache: 'force-cache',
});
if (!response.ok) {
return <div>오류가 발생했습니다.</div>;
}
const books: BookData[] = await response.json();
return (
<div>
{books.map((book) => (
<BookItem key={book.id} {...book} />
))}
</div>
);
}
export default function Page({
searchParams,
}: {
searchParams: {
q?: string;
};
}) {
return (
<Suspense fallback={<div>Loading...</div>}>
<SearchResult q={searchParams.q || ''} />
</Suspense>
);
}
<Suspense key={searchParams.q || ''} fallback={<div>Loading...</div>}>
<SearchResult q={searchParams.q || ''} />
</Suspense>
try-catch 블록.
error.tsx
파일 설정.
'use client'
const Error = ({ error, reset }: { error: Error; reset: () => void }) => {
useEffect(() => {
console.error(error.message);
}, [error]);
return (
<div>
<h3>오류가 발생했습니다.</h3>
<button onClick={() => reset()}>다시 시도</button>
</div>
)
}
export default Error
"use client"
적용.reset
: 에러가 발생한 페이지를 복구하기 위해 다시 컴포넌트를 렌더링 시키는 함수.window.location.reload()
router.refresh()
: 현재 페이지에 필요한 서버 컴포넌트들을 다시 불러옴. 비동기로 작동. <button
onClick={() => {
startTransition(() => {
router.refresh();
reset(); // 에러 상태를 초기화, 컴포넌트를 다시 렌더링.
}
}}
>
다시 시도
</button>
startTransition
: 하나의 콜백함수를 전달. 해당 콜백함수 안에 들어있는 UI를 변경하는 작업을 모두 일괄적으로 수행.