ステップ 9:ライブ検索
CoddyのReactジャーニー「Next.js の基本」セクションの一部。レッスン 47/47。
チャレンジ
中級ライブ検索を備えた Coddy Eats を完成させましょう。
- ファイル
app/api/dishes/route.jsを完成させ、async function GET()をエクスポートしてgetDishes()を await し、Response.json(dishes)を返します。 - ファイル
components/SearchBox.jsxを'use client';とともに完成させ、状態としてquery文字列とmatches配列を保持します。 <input id="search-input" type="text">をqueryにバインドしてレンダリングします。変更時には、テキストが空なら matches をクリアし、それ以外の場合はfetch('/api/dishes')、await response.json()を実行し、nameにテキストが含まれる料理(大文字と小文字を区別しない)のみを保持します。<ul id="search-results" className="reviews">をレンダリングし、各一致項目につき<li>を 1 つ含めます。各<li>には、id={'match-' + dish.slug}、href={'/menu/' + dish.slug}、絵文字、スペース、続けて名前を含む<Link>を配置します。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 の基本のすべてのレッスン
8プロジェクト:Coddy Eats
ステップ 1:シェル(骨組み)