Шаг 9: Живой поиск
Часть раздела Основы Next.js путешествия по React на Coddy — урок 47 из 47.
Задание
СреднеЗавершите Coddy Eats с помощью живого поиска.
- Создайте
app/api/dishes/route.js, экспортирующийasync function GET(), который вызываетawait getDishes()и возвращаетResponse.json(dishes). - Создайте
components/SearchBox.jsxс директивой'use client';, содержащий строкуqueryи массивmatchesв состоянии (state). - Отрендерите
<input id="search-input" type="text">, привязанный кquery. При изменении: если текст пустой, очистите совпадения; в противном случае выполнитеfetch('/api/dishes'),await response.json()и сохраните только те блюда, чьё полеnameсодержит введенный текст (без учета регистра). - Отрендерите
<ul id="search-results" className="reviews">с элементом<li>для каждого совпадения, содержащим<Link>сid={'match-' + dish.slug},href={'/menu/' + dish.slug}, а также emoji, пробел и название. - Отрендерите
<SearchBox />внутри hero на страницеapp/page.jsx.
Попробуйте сами
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>
);
}