Vite + TanStack Router - 8. その他の便利な機能
最後にTanStackRouterの便利な機能をいくつかご紹介します。
Devtools
画面上Routerの状態を表示するコンポーネントを追加できます。 あまり使うことはないと思いますが、contextの中身をみられるのは便利です。
- インストール
npm install -D @tanstack/router-devtools
src/routes/__root.tsx
でDevToolsを読み込む
import { Fragment, lazy, Suspense } from "react";import { Outlet, createRootRoute } from "@tanstack/react-router";
const TanStackRouterDevtools =process.env.NODE_ENV === "production"? () => null // Render nothing in production: lazy(() => // Lazy load in development import("@tanstack/router-devtools").then((res) => ({ default: res.TanStackRouterDevtools, // For Embedded Mode // default: res.TanStackRouterDevtoolsPanel })), );
export const Route = createRootRoute({component: RootComponent,});
function RootComponent() { return ( <Fragment> <div>Hello "__root"!</div> <Outlet /> <Suspense> <TanStackRouterDevtools></TanStackRouterDevtools> </Suspense> </Fragment> );}
-
npm run dev
を実行すると、ブラウザの左下にDevToolsが表示されます。 -
DevToolsをクリックするとルーターの状態が見られるようになります。
スクロール位置の復元
<ScrollRestoration />
コンポーネントを足すだけでページを戻った場合にスクロールの位置を復元できます。
<ScrollRestoration />
は deprecated になりました。代わりに createRouter
の scrollRestoration
を使います。
import { createRouter } from '@tanstack/react-router'
const router = createRouter({ scrollRestoration: true,})
Route Masking
ブラウザのロケーションバーに表示されるURLの一部を隠すことができます。
https://tanstack.com/router/latest/docs/framework/react/guide/route-masking
たとえば、
- /post/6/modal の modalを隠す
- /index?login=true の
?login=true
を隠す
といった使い方をします。
ただし、以下の2つの操作をするとマスクが外れます。
- URLをコピーしたとき、マスクは外れる
- ページをリロードしたとき、マスクは外れる
このうち2番目のページリロードについては、マスクを維持する方法が3つあります。
- https://tanstack.com/router/latest/docs/framework/react/guide/route-masking#unmasking-on-page-reload
Navigation Blocking
GMailの「このページから離れますか?」と同様のダイアログを実現する仕組みです。
useBlocker
というフックを使うだけで実現できます。
import { useBlocker } from '@tanstack/react-router'
function MyComponent() { const [formIsDirty, setFormIsDirty] = useState(false)
useBlocker({ shouldBlockFn: () => { if (!formIsDirty) return false
const shouldLeave = confirm('Are you sure you want to leave?') return !shouldLeave }, })
// ...}
Eslintルール
TanStack Router用のルールがあるのでインストールしておくとよいでしょう。
https://tanstack.com/router/latest/docs/eslint/eslint-plugin-router
Static Route Data
Static Route Dataはルーター内部のグローバル定数のようなもので、これを使うと階層が下のルートで設定した値を上のルートで参照できるようになります。
現在どのページにいるかを共通ヘッダに表示したい場合などに使います。
Static Route Data https://tanstack.com/router/latest/docs/framework/react/guide/static-route-data
必要なパラメータが更新されたときだけルートを再レンダリングする
useSearch
などのフックの引数に関数を渡して、必要な値だけを取り出すようにすると、その値が変更されたときのみコンポーネントが再レンダリングされます。
reduxなどの状態管理ライブラリと合わせて使うことの多いreselectのようなものです。
バーチャルファイルルート
バーチャルファイルルートを有効にすると、ファイルベースルーティングの振る舞いをオーバーライドできます。
ディレクトリ構造を無視してルートを設定したい場合に使いますが、ファイルベースルーティングの良さを消してしまうので乱用は禁物です。
- バーチャルルートとは別物
- パス名とファイルの対応関係を変更できる
- viteの設定で、TanStackRouter pluginに設定の追加が必要 or
tsr.config.ts
で設定が必要 __virtual.ts
ファイルを置くことで、ファイルベースルーティングの一部だけを書き換えることもできる- 詳細 → https://tanstack.com/router/latest/docs/framework/react/routing/virtual-file-routes#virtual-routes-inside-of-tanstack-router-file-based-routing