ドットインストールで学習して重要だと思った部分をまとめていきます。
Appフォルダのpage.tsxがまず最初に表示される。
appフォルダ内のpage.tsx, layout.tsx, globals.cssで不要なファイルを削除してから開発スタート。
ルーティング:urlに応じて適切なページを表示させる仕組み。
ダイナミックルーティング:urlを/users/[userId]/page.tsxのようにし、受け取った値でページを出しわけする仕組み。
// propsを使用し値を受け取る
// オブジェクトの型付けはtypeではなくinterfaceを使う。typeは単独の値を受け取るときに使う。
interface Props {
params: {userId: string}; // paramsは決まった言い方。userIdはフォルダ名。stringは決まった型。
}
リンクの設定はLinkコンポーネントを使う。next/linkをクリックすれば自動でコンポーネントが読み込まれる。
<Link href='/users/1' className='text-blue-500 hover-text-blue-700'>
User 1
</Link>;
データはappフォルダの中に別のフォルダ(ここではlibraryを意味するlib)を作成し、その中にファイルを作成する。
interface User {
id: number;
name: string;
prof: string;
}
export const Users: User[] = [
{ id: 0, name: 'Taro', prof: 'Frontend Engineer' },
];
page.tsxで読み込んで、map()で展開する。
import { users } from './lib/users';
export default function Home() {
const userItems = users.map((user) => {
return (
<li key={user.id}>
<Link
href={`/users/${user.id}`}
className='text-blue-500 hover:text-blue-700'
>
{user.name}
</Link>
</li>
);
});
return (
<>
<h1 className='text-lg border-b pb-1 mb-1'>Users</h1>
<ul className='list-disc ml-4'>{userItems}</ul>
</>
);
}
個別ページは一覧ページからidを受け取り、そのidと合うオブジェクトのデータをlibから取得し表示する。
const user = users[Number(props.params.userId)];
// 存在しないページに遷移した場合、標準のエラーページに遷移させる。
if (user === undefined) {
notFound();
}
return (
<>
<h1 className='text-lg border-b pb-1 mb-1'>{user.name}</h1>
<p>{user.prof}</p>
<p className='mt-4'>
<Link href='/' className='text-blue-500 hover:text-blue-700'>
Go Back
</Link>
</p>
</>
);
存在しないユーザーのidが入力された時のように、ユーザーが存在しないことを知らせる特別なファイルを作ることもできる。
// app/users/not-found.tsx
import Link from 'next/link';
export default function UserNotFoundPage() {
return (
<>
<h1 className='text-lg border-b pb-1 mb-1'>Error</h1>
<p>User not found.</p>
<p className='mt-4'>
<Link href='/' className='text-blue-500 hover:text-blue-700'>
Go Back
</Link>
</p>
</>
);
}