Menu
Coddy logo textTech

9단계: 실시간 검색

Coddy React 여정의 Next.js 핵심 (Next.js Essentials) 섹션에 포함된 레슨. 47개 중 47번째.

challenge icon

챌린지

중급

Coddy Eats에 실시간 검색 기능을 완성하세요.

  1. app/api/dishes/route.js 파일에서 async function GET()을 내보내도록 완성하고, getDishes()를 기다린 후 Response.json(dishes)를 반환하세요.
  2. components/SearchBox.jsx 파일을 'use client';와 함께 완성하고, 상태에 query 문자열과 matches 배열을 저장하세요.
  3. <input id="search-input" type="text">를 렌더링하고 query에 연결하세요. 변경 시 텍스트가 비어 있으면 matches를 비우고, 그렇지 않으면 fetch('/api/dishes')를 실행하고 await response.json()을 사용한 다음, name에 해당 텍스트가 포함된 요리만 대소문자를 구분하지 않고 유지하세요.
  4. <ul id="search-results" className="reviews">를 렌더링하고, 일치하는 각 항목마다 <li>를 하나씩 포함하세요. 각 항목에는 id={'match-' + dish.slug}, href={'/menu/' + dish.slug}와 이모지, 공백, 이름이 들어 있는 <Link>를 포함하세요.
  5. app/page.jsx의 hero 내부에 <SearchBox />를 렌더링하세요.

직접 해보기

import Link from 'next/link';
import './globals.css';

export const metadata = {
    title: {
        default: 'Coddy Eats',
        template: '%s | Coddy Eats',
    },
};

export default function RootLayout({ children }) {
    return (
        <html lang="en">
            <body>
                <nav className="nav">
                    <Link className="brand" href="/">Coddy Eats</Link>
                    <Link id="nav-menu" href="/">Menu</Link>
                    <Link id="nav-desserts" href="/?category=dessert">Desserts</Link>
                </nav>
                <div className="container">
                    {children}
                </div>
            </body>
        </html>
    );
}

Next.js 핵심 (Next.js Essentials)의 모든 레슨