前回やったルーティングに「products」を追加し、親レイアウトに追加でサイドバーに「product一覧」を表示するレイアウトを追加したいと思います。
SvelteKit はファイルシステムベースのルーティングが採用されており、src/routesディレクトリ内に+page.svelteファイルを作成することで…
redsum.net
ディレクトリ構成は以下の感じです。
src/routes
├ ...
└ products
├ +layout.server.ts
├ +layout.svelte
├ +page.svelte
├ data.ts
└ [id]
├ +error.svelte
├ +page.server.ts
└ +page.svelte
コード
data.ts はこんな感じ
export const products = [
{
id: '001',
name: 'productA',
},
{
id: '002',
name: 'productB',
},
{
id: '003',
name: 'productC',
},
{
id: '004',
name: 'productD',
},
{
id: '005',
name: 'productE',
},
]
src/routes/products 階層
import { products } from './data';
export function load() {
return {
summaries: products.map((product) => ({
id: product.id,
name: product.name,
}))
};
}
<script lang='ts'>
import type { PageData } from './$types.js';
export let data: PageData;
</script>
<div class='container'>
<aside>
<h2>Product一覧</h2>
<ul>
{#each data.summaries as { id, name }}
<li>
<a href='/products/{id}'>{name}</a>
</li>
{/each}
</ul>
</aside>
<section>
<slot />
</section>
</div>
<style>
.container {
width: 100%;
display: flex;
}
aside {
width: 20%;
}
section {
width: 80%;
}
</style>
<script lang='ts'>
import type { PageData } from './$types.js';
export let data: PageData;
</script>
<h1>Products</h1>
<ul>
{#each data.summaries as { id, name }}
<li><a href="/products/{id}">{name}</a></li>
{/each}
</ul>
src/routes/products/[id] 階層
前回とインポート名が変わるだけなので割愛します。
とりあえず画面だけ…