Qwikの主な3つのルート
Qwikにおける3つのルートについて説明したいと思います。
QwikもNext.jsやRemixと同様にroutes
直下にディレクトリを作成し、その中にindex.tsx/mdx/md
を作成することで、そこがエントリーポイントとして機能します。
1. ディレクトリ直下のindex.tsx/mdx/md
/
└─ src
└─ routes
├─ layout.tsx
├─ user
│ └─ index.tsx # https://sample.com/user
├─ company
│ └─ index.mdx # https://sample.com/company
└─ product
└─ index.md # https://sample.com/product
最も基本的なルートです。
例えば上記のようにuserディレクトリを作成し、その直下にindex.tsx
を作成する場合のルートです。
この場合、ファイル名は必ず「index」から始まる必要があります。
2. 動的セグメント その1
/
└─ src
└─ routes
├─ layout.tsx
└─ user
└─ [name]
└─ index.tsx # https://sample.com/user/[name]
上記例ではroutes
直下にuser
というディレクトリを作成し、その直下にさらに[name]
という形式でディレクトリを作成することで使用できるルートです。[]
内は任意に命名できます。
そして、[name]
直下にはindex.tsx
を作成します。
以下のコードは簡単な使用例です。
https://sample.com/user/john
というURLが叩かれた場合に、john
を取得する場合です。
useLocation
を使用してloc.params.name
とします。この場合のname
は自身で命名した[name]
のname
になります。
import { component$ } from "@builder.io/qwik";
import { Hello } from "~/components/hello/hello";
import { useLocation } from "@builder.io/qwik-city";
export default component$(() => {
const loc = useLocation();
return (
<Hello name={loc.params.name} />
);
});
3. 動的セグメント その2
/
└─ src
└─ routes
├─ layout.tsx
├─ user
│ └─ [name]
│ └─ index.tsx # https://sample.com/user/[name]
├─ company
│ ├─ [name]
│ │ └─ index.tsx # https://sample.com/company/[name]
│ └─ [...all]
│ └─ index.tsx # https://sample.com/company/ *
└─ [...rest]
└─ index.tsx # You tried a route that doesn't exist.
src/routes/user/[name]/index.tsx → /user/[name]
src/routes/company/[name]/index.tsx → /company/[name]
src/routes/company/[...all]/index.tsx → /company/anything else that didnt match
src/routes/[...rest]/index.tsx → /anything else that didnt match
まずcompany
直下の[name]
はデータベースに登録されているいずれかに該当するcompany
が存在する場合のルートです。該当するcompany
が存在しない場合は[...all]
のルートが呼ばれることになります。
同様にroutes
直下に[...rest]
ディレクトリを作成した場合のルートです。どのルートにも該当しなかった場合に使用されるルートです。この場合も同様にuseLocation().params.rest
とすることでクエリパラメータを取得します。
おわりに
以下はRemixのルーティングの例になりますが、user
ディレクトリ下にinfo
やcontact
、post
などのルートも配置ができるようになっています。個人的にQwikのディレクトリベースのルーティングの方がシンプルでわかりやすくて良いと感じました。
/
└─ src
└─ routes/
└─ user/
├─ _index.tsx /user
├─ info.tsx /user/info
├─ info.contact.tsx /user/info/contact
└─ post.$id.tsx /user/post/[id]
Discussion