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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

React.js

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

Q&A

解決済

1回答

3212閲覧

React, Bootstrapを使って他のページに飛ぶLinkを作りたい。

YSK85

総合スコア32

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

React.js

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

0グッド

0クリップ

投稿2022/01/24 23:40

React, Bootstrapを使って他のページに飛ぶNavbarを作っているのですが、うまく実装できません。
やりたいことはいたってシンプルでNavbarの各Linkボタンをクリックするとコンポーネントの内容 (Aboutを押せばAboutコンポーネント、Worksを押せばWorksコンポーネントの内容) を表示させるということですが以下のコードで実行すると画面が真っ白になります。

import React from "react"; import { Navbar, Nav, Container } from "react-bootstrap" import { Routes, Route } from "react-router-dom" import Works from "./Works" import About from "./About"; import LandingPage from "./LandingPage"; const Links = () => { return ( <> <Navbar bg="dark" variant="dark"> <Container> <Navbar.Brand href="/">ABCDEFG</Navbar.Brand> <Nav className="me-auto"> <Nav.Link href="/Works">My Works</Nav.Link> <Nav.Link href="/About">About</Nav.Link> </Nav> </Container> </Navbar> <Routes> <Route exact path="/" component={LandingPage} /> <Route exact path="/Works" component={Works} /> <Route exact path="/About" component={About} /> </Routes> </> ) } export default Links

何卒、助言をいただければと思います。
よろしくお願いいたします。

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

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

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

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

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

YSK85

2022/01/25 14:32

package.json { "name": "AAAAA", "version": "0.1.0", "private": true, "dependencies": { "@testing-library/jest-dom": "^5.16.1", "@testing-library/react": "^12.1.2", "@testing-library/user-event": "^13.5.0", "bootstrap": "^5.1.3", "react": "^17.0.2", "react-bootstrap": "^2.1.0", "react-dom": "^17.0.2", "react-router-bootstrap": "^0.26.0", "react-router-dom": "^6.2.1", "react-scripts": "5.0.0", "web-vitals": "^2.1.3" }, "scripts": { "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { "extends": [ "react-app", "react-app/jest" ] }, "browserslist": { "production": [ ">0.2%", "not dead", "not op_mini all" ], "development": [ "last 1 chrome version", "last 1 firefox version", "last 1 safari version" ] } } App.js import React from 'react'; import './App.css'; import "bootstrap/dist/css/bootstrap.min.css"; import Links from './Component/Links'; import LandingPage from "./Component/LandingPage"; // import { BrowserRouter as Route, Routes} from "react-router-dom"; // import Works from './Component/Works'; function App() { return ( <div className="App"> <Links /> <LandingPage /> </div> ); } export default App;
guest

回答1

0

ベストアンサー

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>

投稿2022/01/25 03:32

編集2022/01/26 03:00
hoshi-takanori

総合スコア7895

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

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

YSK85

2022/01/25 14:32

ご指摘いただきまして誠にありがとうございます。 ご指導いただいた方法を実行しましたが、未だ状況は改善されません。 一つ思ったのは、ただいま作業をしているのがLinks.jsというファイルとApp.jsファイルにLandingPageファイルをインポートしているのですが、これはLinks.jsだけにインポートするだけでいいのでしょうか? インポートしていた理由はデフォルトでLandingPageを表示したいのと、他のページからABCDEFG部分を押した際ホーム画面に戻るようにした方からです。 追記の方にApp.jsファイルと一応package.jsonファイルの内容も載せておきます。 何卒よろしくお願いいたします。
hoshi-takanori

2022/01/25 14:56 編集

App.js を見ると BrowserRouter がコメントアウトされてますが、実際には App.js か index.js で使われてますか? これがないと react-router は動かないはず…。 次に、App.js と Links.js の両方に LoadingPage があると LoadingPage が二重に表示されたりするのでは。 LoadingPage (や Works や About) をどっちで使うかは、実際にページの内容を表示するのをどこでやるかによりますが、App.js の方が自然な気はしますね。
YSK85

2022/01/26 01:33

ご教示ありがとうございます。 どちらでもBrowserRouterは使っていませんでしたので、App.jsに<BrowserRouter>を加えました。 現在以下のようなコードになってます。また表示したいのはApp.js内でしたのでLink.js内のLoadingPageは削除しました。 エラーは出ていませんが、いまだ真白のままです。 App.js import React from 'react'; import './App.css'; import "bootstrap/dist/css/bootstrap.min.css"; import Links from './Component/Links'; import LandingPage from "./Component/LandingPage"; import { BrowserRouter as Router, Routes, Route } from "react-router-dom"; function App() { return ( <div className="App"> <Router> <Routes> <Route> <Links /> <LandingPage /> </Route> </Routes> </Router> </div> ); } export default App; Links.js import React from "react"; import { Navbar, Nav, Container } from "react-bootstrap" import { Routes, Route, BrowserRouter } from "react-router-dom" import {LinkContainer} from "react-router-bootstrap" import Works from "./Works" import About from "./About"; const Links = () => { return ( <> <Navbar bg="dark" variant="dark"> <Container> <LinkContainer to="/"> <Navbar.Brand>ABCDEFG</Navbar.Brand> </LinkContainer> <Nav className="me-auto"> <LinkContainer to="/Works"> <Nav.Link >My Works</Nav.Link> </LinkContainer> <LinkContainer to="/About"> <Nav.Link >About</Nav.Link> </LinkContainer> </Nav> </Container> </Navbar> <BrowserRouter> <Routes> <Route exact path="/Works" element={<Works />} /> <Route exact path="/About" element={<About />} /> </Routes> </BrowserRouter> </> ) } export default Links ご丁寧な指摘、誠にありがとうございます。
YSK85

2022/01/26 16:02 編集

今試したら動きました! こちらの至らない質問の仕方にも丁寧かつ的確なご指導をしていただきまして 本当にありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問