Vite + TanStack Router - 3. ルートの遷移
ルート遷移には 4つの方法があります。ユーザーのクリックでページを移動する場合は1を使い、それ以外の場合に2〜4を使います。
とりあえず1と2だけ覚えておけば事足りると思います。
<Link />コンポーネントを使うuseNavigate()フックを使う<Navigate />コンポーネントを使うRouter.navigate()APIを使う
1. <Link /> コンポーネント
<Link /> コンポーネントは <a /> タグに変換されます。
to属性
to に遷移先のパスを書きます。<a />タグのhrefにあたります。
<Link to="/posts">Posts</Link>params属性
パスパラメータを渡す場合はparamsを使います。以下の例では http://localhost/posts/123 となります。
<Link to="/posts/$postId" params={{postId: '123'}}>Post 123</Link>from属性
from には今いるページのパスを書きます。from属性は必須ではありません、toを相対パスにしたい場合に指定します。
const postIdRoute = createRoute({ path: '/blog/post/$postId',})
const link = ( <Link from={postIdRoute.fullPath} to="../categories"> Categories </Link>)また、from を書いておくと searchの型推定が速くなります。
search 属性
サーチパラメータはsearch 属性に書きます。search属性にはオブジェクトもしくは関数を書きます。
以下の例では http://localhost/search?query=tanstack となります。
<Link to="/search" search={{ query: 'tanstack' }}> Search</Link>関数は前のパラメータを引数に受け取るので、一部だけ書きかえたいときに便利です。
<Link to="." search={ (prev) => ({ ...prev, page: prev.page + 1, }) }> Next Page</Link>hash属性
ハッシュは hash で追加し、to="/post/111#title" のようには書きません。
activeProps と inactiveProps
リンクがアクティブになったとき、非アクティブになったとき classNameやstyleなどの属性を設定できます。オブジェクトまたは関数を指定できます。
classNameとstyle のみは <Link /> で指定したものとマージされますが、その他の属性は上書きされます。
<Link to="/section-1" activeProps={ { style: { fontWeight: 'bold', }, className: "active", } }>Section 1</Link>子要素にアクティブ状態を渡す
<Link /> の子要素として関数を定義すると、引数で isActive を受け取れます。
<Link to="/blog/post"> {({ isActive }) => { return ( <> <span>My Blog Post</span> <icon className={isActive ? 'active' : 'inactive'} /> </> ) }}</Link>2. useNavigateフック
フックを実行した戻り値のnavigate 関数を使ってページ遷移します。
const navigate = useNavigate({from: '/post/$postId'})// ...navigate({ to: '/posts/$postId', params: { postId } })3. <Navigate /> コンポーネント
コンポーネントがマウントされたタイミングでページ遷移が起こります。
4. router.navigate API
useNavigateフックの戻り値と同じ、ただしrouterを参照できればどこでも使えます。
<MatchRoute /> と useMatchRoute()
to属性で指定したルートにマッチしたときだけに表示されるコンポーネントです。
pending 属性をつけるとページ遷移時に時間がかかる場合にページを読込中であることを表示するのに使えます。
表示・非表示を自動で切り替えてくれるので便利です。
linkOptions関数
linkOptions 関数を使うと <Link /> navigation redirect で共通で使えるオプションを作成できます。
まとめ
- ユーザー操作のページ遷移には
<a />タグではなく<Link />を使う - コールバック内からのページ遷移には
useNavigationフックを使う