質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

2352閲覧

react routeで子Routeのオブジェクトがレンダリングされない

seita1224

総合スコア14

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2022/01/30 05:31

前提・実現したいこと

react-router-dom v6でルーティング処理を書いているのですが、思った通りにルーティングができないのでこちらで質問させていただきました。

発生している問題・エラーメッセージ

http://localhost:3000/home/user_management」にアクセスしても親Routeのオブジェクトがレンダリングされてしまい思っている子Routeのオブジェクトがレンダリングされないという事象に陥っています。
子Routeのオブジェクト: <UserManegement /> or <Setting />
親Routeのオブジェクト: <Home />

該当のソースコード

Router.tsx

typescript

1import { memo, VFC } from "react"; 2import { Route, Routes } from "react-router-dom"; 3 4import { Login } from "../components/pages/Login"; 5import { homeRoutes } from "./HomeRoutes"; 6import { Home } from "../components/pages/Home"; 7import { Page404 } from "../components/pages/Page404"; 8import { HeaderLayout } from "../components/templates/HeaderLayout"; 9 10export const Router: VFC = memo(() => { 11 return ( 12 <Routes> 13 <Route path="/" element={<Login />} /> 14 <Route path="home" element={<HeaderLayout><Home /></HeaderLayout>} > 15 { 16 homeRoutes.map((route, index) => ( 17 <Route path={route.path} element={<HeaderLayout>{route.children}</HeaderLayout>} /> 18 )) 19 } 20 </Route> 21 <Route path="*" element={<Page404 />} /> 22 </Routes> 23 ) 24})

HomeRoutes.tsx

typescript

1import { UserManegement } from "../components/pages/UserManegement" 2import { Setting } from "../components/pages/Setting" 3 4export const homeRoutes = [ 5 { 6 path: "user_management", 7 children: <UserManegement /> 8 }, 9 { 10 path: "setting", 11 children: <Setting /> 12 } 13]

自分で調べたことや試したこと

ネストせずに書いた場合はちゃんと想定している通りにルーティングが動いているのでルーティング先のオブジェクトが悪いといったわけではないことは確認しています。
※「<UserManegement />」、「<Setting />」も含めて

ネストしたバージョン
http://localhost:3000/ → 「<Login />」がレンダリングされる
http://localhost:3000/home/ →<Login />」がレンダリングされる

typescript

1<Route path="/" element={<Login />} > 2 <Route path="home" element={<Home />} /> 3</Route >

ネストしなかったバージョン
http://localhost:3000/ → 「<Login />」がレンダリングされる
http://localhost:3000/home/ → 「<Home />」がレンダリングされる

typescript

1<Route path="/" element={<Login />} /> 2<Route path="/home" element={<Home />} />

使っているツールのバージョンなど補足情報
package-lock.jsonの一部抜粋

json

1"dependencies": { 2 "@chakra-ui/react": "^1.7.4", 3 "@emotion/react": "^11.7.1", 4 "@emotion/styled": "^11.6.0", 5 "@testing-library/jest-dom": "^5.16.1", 6 "@testing-library/react": "^12.1.2", 7 "@testing-library/user-event": "^13.5.0", 8 "@types/jest": "^27.4.0", 9 "@types/node": "^16.11.21", 10 "@types/react": "^17.0.38", 11 "@types/react-dom": "^17.0.11", 12 "framer-motion": "^5.6.0", 13 "react": "^17.0.2", 14 "react-dom": "^17.0.2", 15 "react-router-dom": "^6.2.1", 16 "react-scripts": "5.0.0", 17 "typescript": "^4.5.5", 18 "web-vitals": "^2.1.4" 19 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

react-router v6 で Route を入れ子にする場合、親の Route の elelment の <Outlet /> が子の Route の element で置き換えられるようです。
参考: React Router 6: Nested Routes

jsx

1// import に Outlet を追加 2import { Route, Routes, Outlet } from "react-router-dom"; 3 4 <Routes> 5 <Route index element={<Login />} /> 6 <Route path="home" element={<HeaderLayout><Outlet /></HeaderLayout>} > 7 <Route index element={<Home />} /> 8 { 9 homeRoutes.map(route => ( 10 <Route key={route.path} path={route.path} element={route.children} /> 11 )) 12 } 13 </Route> 14 <Route path="*" element={<Page404 />} /> 15 </Routes>

投稿2022/02/01 22:21

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問