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

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

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

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

TypeScript

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

React.js

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

解決済

React-Router V6でuseNavigate利用時のBrowserRouterの適切な位置と影響範囲が分かりません。

HALUO
HALUO

総合スコア27

Router

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

TypeScript

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

React.js

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

1回答

0評価

0クリップ

1205閲覧

投稿2022/01/19 02:05

React-Router V6に更新したのですが、useNavigateはRouterを使わないとダメだと言われたので、
利用箇所をRouterで囲ったのですが、下記エラーが取れず困っております。
タイトルの通り不明点はRouterをどこに設定するかになります。

**Uncaught Error: useNavigate() may be used only in the context of a <Router> component.
**

ヘッダーのメニュー部分で認証画面に飛ばしたいので、ヘッダー関連のindex.tsx内でuseNavigateを使う
HeaderMenuをRouterで囲みましたがダメで、menu.tsxも囲ってみましたが変化ありませんでした。

index.tsx const Header: FC<Props> = ({ openDialog }) => { const [open, setOpen] = useState(false); return ( <header css={wrapperStyle}> <a css={anchorStyle} href="/lp.html"> <img css={imageStyle} src="/images/logo_white.png" /> </a> <div css={menuStyle}> <button css={menuButtonStyle} onClick={() => { setOpen(true); }} > <i className="material-icons" css={menuIconStyle}> menu </i> </button> <BrowserRouter> {open ? ( <HeaderMenu onClick={setOpen} openDialog={openDialog} /> ) : null} </BrowserRouter> </div> </header> ); };
menu.tsx import { useNavigate, BrowserRouter as Router, Routes } from "react-router-dom";   ・   ・   ・ const navigate = useNavigate(); const handleOnClickMoveLogin = () => { navigate("auth/home"); }; return ( <Router> <Routes> <ul css={menuStlye}> <li css={menuListStyle}> <button css={menuButtonStyle} onClick={handleOnClickCreateRoom}> フライト作成 </button> <button css={menuButtonStyle} onClick={handleOnClickMoveLogin}> ログイン/サインイン </button> <button css={menuButtonStyle}>フライト検索</button> <button css={menuButtonStyle}>マイページ</button> <button css={menuButtonStyle}>プレミアム</button> </li> </ul> </Routes> </Router> ); };

そもそもソースコード全体に影響するのかと思い、上記箇所のRouterも含め削除しmain.tsxのみBrowserRouterで囲ったのですが、
今度は以下のエラーになります。

Uncaught Error: [undefined] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>

main.tsx (async () => { log(`${name} v${version}`); document.title += ` v${version}`; render( <React.StrictMode> <Global styles={globalStyle} /> <BrowserRouter> <App /> </BrowserRouter> </React.StrictMode>, document.getElementById("contents") ); })().catch((err) => console.error(err));

React-Router関連のディレクトリ構造は以下になるのですが、
この場合、どこをRouterで囲えば良いのでしょうか??

srcーauthーHome                ーSigninなど      ーlpーheaderーindex                         ーmenu            ーmain            ーapp      ーrouterーrouterなど

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Router

Routerは、異なるネットワーク同士を相互に接続するための通信機器。インターネットでのデータを自動的に振り分け、一つのインターネット回線を複数のコンピュータで使用することが可能です。DHCPによりIPアドレスを自動的に割振りすることもできます。

TypeScript

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

React.js

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