1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Remix]ログイン前後のレイアウトを変える

Last updated at Posted at 2024-10-14

既存のコード

Remixでルートレイアウト(root.tsx)にサイドメニュー+コンテンツのレイアウトを作成

root.tsx
export default function App() {
  return (
    <html lang="jp">
      <head>
        <meta charSet="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <Meta />
        <Links />
      </head>
      <body className="flex min-h-screen">
        <Sidebar />
        <div className="flex-1 p-5">
          <Outlet />
        </div>
        <ScrollRestoration />
        <Scripts />
      </body>
    </html>
  );
}

既存のルート構造

image.png

ホーム画面にレイアウトが適応される
image.png

ログイン画面にも適応される(当たり前)
image.png

ルートの変更

Remixドキュメントを見ながらルートを変更
RemixDocs-RouteFileNaming

image.png

変更
_authはURLから無視され、.は/に変換される。
_auth.tsxで_auth以下のページのレイアウトを定義できるらしいです。
image.png
 
変わらない…😥
image.png

原因はroot.tsxをサイドメニュー+コンテンツのレイアウトにしているから

_auth.tsxにレイアウトを定義しても、親のルートレイアウト(root.tsx)を継承するのでサイドメニューが表示される。
 
回避方法としては
①root.tsxをサイドメニュー無しにして、_auth以外のルートにはサイドメニューを付ける。
 →ディレクトリが増えるたびにサイドメニューコンポーネントを入れるのは微妙では…
 
②root.tsxでレイアウトを分岐させる。
 →一旦、こちらで対応

root.tsxでレイアウト分岐(暫定)

root.tsx
export default function App() {
  const location = useLocation();
  
  // ログインやサインアップのルートではサイドメニューを非表示にする
  const isAuthRoute = location.pathname.startsWith("/login") || location.pathname.startsWith("/signup");

  return (
    <html lang="jp">
      <head>
        <meta charSet="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <Meta />
        <Links />
      </head>
      <body className="min-h-screen">
        {!isAuthRoute && (
          <div className="flex">
            <Sidebar />
            <div className="flex-1 p-5">
              <Outlet />
            </div>
          </div>
        )}
        {isAuthRoute && (
          <div className="flex-1 p-5">
            <Outlet />
          </div>
        )}
        <ScrollRestoration />
        <Scripts />
      </body>
    </html>
  );
}

 
サイドメニュー無しのレイアウトになった。
image.png
 
ログイン後はサイドメニュー有り
image.png

まとめ

とりあえずレイアウトは分けれたのですが、これがベストなのかよく分からず…
フロントエンドはあまり得意ではないので、公式ドキュメントや記事を探したいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?