Menu
Coddy logo textTech

Paso 9: Búsqueda en vivo

Parte de la sección Esenciales de Next.js del Journey de React de Coddy. Lección 47 de 47.

challenge icon

Desafío

Intermedio

Termina Coddy Eats con una búsqueda en vivo.

  1. Completa el archivo app/api/dishes/route.js exportando async function GET() que espere getDishes() y devuelva Response.json(dishes).
  2. Completa el archivo components/SearchBox.jsx con 'use client';, manteniendo una cadena query y un arreglo matches en el estado.
  3. Renderiza <input id="search-input" type="text"> vinculado a query. Al cambiar: si el texto está vacío, borra las coincidencias; de lo contrario, usa fetch('/api/dishes'), await response.json() y conserva los platos cuyo name contenga el texto, sin distinguir entre mayúsculas y minúsculas.
  4. Renderiza <ul id="search-results" className="reviews"> con un <li> por cada coincidencia que contenga un <Link> con id={'match-' + dish.slug}, href={'/menu/' + dish.slug} y el emoji, un espacio y después el nombre.
  5. Renderiza <SearchBox /> dentro del hero en app/page.jsx.

Pruébalo tú mismo

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>
    );
}

Todas las lecciones de Esenciales de Next.js