Open9
Remix Tutorialをやってみる
Quick Startをさらったので、次のTutorialをやってみる
既に存在しているテンプレートを使って電話帳っぽいものを作るみたい
ディレクトリ作成はスムーズ
ビルドツールはviteで、サーバモジュールはremix-serve
Quick Startで触ったのと同様の構成
npm run dev
で起動するとこんな感じだった
あらかじめ用意されたcssをインポートする
きれい
サイドバーのリンクをクリックしたときのルート先を追加する
以下のようなURLに対応させたい場合、
- /contacts/123
- /contacts/abc
以下のパスにファイル作成する。
app/routes/contacts.$contactId.tsx
📝パス名内にある.
はURLの/
に対応、$
は動的にセグメントを取得することが可能。
<nav>
<ul>
<li>
<a href={`/contacts/1`}>Your Name</a>
</li>
~~
a href
ではなくLink
を使うことでクライアントサイドでルーティングを実装する
(サーバにリクエストを送ることなくUIを変更する)
- <a href={`/contacts/1`}>Your Name</a>
+ <Link to={`/contacts/1`}>Your Name</Link>
データを読み込むにはloader
とuserLoaderData
をつかう
型定義をちゃんとする
const { contacts } = useLoaderData<typeof loader>();
app/routes/contacts.$contactId.tsx
この場合$contactId
部分はファイル内で、params.contactId
として値取得可能。
パラメータの検証とそのレスポンス
import invariant from "tiny-invariant";
export const loader = async ({ params }: LoaderFunctionArgs) => {
// ファイル名とコード内でパラメータ名が異なっているとき(contactId)
invariant(params.contactId, "Missing contactId param");
const contact = await getContact(params.contactId);
// contactがnullのとき
if (!contact) {
throw new Response("Not Found", { status: 404 });
}
return json({ contact });
};