{
const q = context.query.q;
const books = await fetchBooks(q as string);
return {
props: { books },
};
};
export default function SearchPage({
books,
}: InferGetServerSidePropsType// SSR 방식
import { ReactNode, useEffect } from "react";
import SearchableLayout from "@/components/SearchableLayout";
import { InferGetServerSidePropsType } from "next";
import BookItem from "@/components/BookItem";
import { GetServerSidePropsContext } from "next";
import fetchBooks from "@/library/fetchBooks";
import { BookData } from "@/types";
export const getServerSideProps = async (
context: GetServerSidePropsContext
) => {
const q = context.query.q;
const books = await fetchBooks(q as string);
return {
props: { books },
};
};
export default function SearchPage({
books,
}: InferGetServerSidePropsType<typeof getServerSideProps>) {
return (
<div>
{books.map((book) => (
<BookItem key={book.id} {...book} />
))}
</div>
);
}
// SSG 방식
import { ReactNode, useState, useEffect } from "react";
import SearchableLayout from "@/components/SearchableLayout";
import BookItem from "@/components/BookItem";
import fetchBooks from "@/library/fetchBooks";
import { BookData } from "@/types";
import { useRouter } from "next/router";
export default function SearchPage() {
const [books, setBooks] = useState<BookData[]>([]);
const router = useRouter();
const q = router.query.q;
const fetchSearchResult = async () => {
const data = await fetchBooks(q as string);
setBooks(data);
};
useEffect(() => {
if(q) {
fetchSearchResult()
}
}, [q]);
return (
<div>
{books.map((book) => (
<BookItem key={book.id} {...book} />
))}
</div>
);
}
SearchPage.getLayout = (page: ReactNode) => {
return <SearchableLayout>{page}</SearchableLayout>;
};
GetServerSidePropsContext
useRouter()