react-router では、普通のリンク <a href="/">ABCDEFG</a>
だと SPA ではなく完全なページ遷移になってしまい、状態が引き継がれないので、Link コンポーネント を使って <Link to="/">ABCDEFG</Link>
とする必要があります。
react-bootstrap の場合、Navbar.Brand や Nav.Link は通常 a タグが使われますが、これを react-router に対応させるには as={NavLink} を追加し、href を to に変更します。
diff
1-import { Routes, Route } from "react-router-dom"
2+import { Routes, Route, NavLink } from "react-router-dom"
3
4- <Navbar.Brand href="/">ABCDEFG</Navbar.Brand>
5+ <Navbar.Brand as={NavLink} to="/">ABCDEFG</Navbar.Brand>
6 <Nav className="me-auto">
7- <Nav.Link href="/Works">My Works</Nav.Link>
8- <Nav.Link href="/About">About</Nav.Link>
9+ <Nav.Link as={NavLink} to="/Works">My Works</Nav.Link>
10+ <Nav.Link as={NavLink} to="/About">About</Nav.Link>
11 </Nav>
または、react-router-bootstrap の LinkContainer を使う方法もあるようです。
diff
1+import { LinkContainer } from 'react-router-bootstrap'
2
3- <Navbar.Brand href="/">ABCDEFG</Navbar.Brand>
4+ <LinkContainer to="/">
5+ <Navbar.Brand>ABCDEFG</Navbar.Brand>
6+ </LinkContainer>
画面が真っ白になるのは react-router v6 で仕様変更があったせいで、Route の component を element に変更する必要があります。
参考: react-router@v6で何が変わるのか - Qiita
diff
1- <Route exact path="/" component={LandingPage} />
2- <Route exact path="/Works" component={Works} />
3- <Route exact path="/About" component={About} />
4+ <Route exact path="/" element={<LandingPage />} />
5+ <Route exact path="/Works" element={<Works />} />
6+ <Route exact path="/About" element={<About />} />
コメント欄へのお返事
react-router の使い方に関して、根本的な誤解があるような気がします。
- BrowserRouter (Router) が App.js と Links.js の両方で使われてますが、基本的に最上位レベルで、1 回だけ使うべきものです。
- Links.js はたぶんヘッダーの部分だけを定義したいんだと思いますので、ここに BrowserRouter や Routes や Route や Works や About は不要なはず。
- App.js では、<Links /> は常に表示して、残りのコンテンツ部分に LandingPage か Works か About を切り替えて表示したいってことだと思うので、次のようにすれば良いのでは。
jsx
1function App() {
2 return (
3 <BrowserRouter>
4 <div className="App">
5 <Links /> {/* Links は無条件に表示される */}
6
7 <Routes> {/* 現在の URL に応じて、LandingPage か Works か About のどれかが表示される */}
8 <Route exact path="/" element={<LandingPage />} />
9 <Route exact path="/Works" element={<Works />} />
10 <Route exact path="/About" element={<About />} />
11 </Routes>
12 </div>
13 </BrowserRouter>
14 );
15}
こうすると、例えば / にアクセスすれば次のように表示され、
jsx
1<div className="App">
2 <Links />
3 <LandingPage />
4</div>
/Works にアクセスすれば次のように表示されると思います。
jsx
1<div className="App">
2 <Links />
3 <Works />
4</div>