ReactJS Bootstrap Navbar und Routing funktionieren nicht zusammen
Lesezeit: 9 Minuten
Ich versuche, eine einfache Webanwendung mit ReactJS zu erstellen, und ich wollte die verwenden Navbar bereitgestellt von React-Bootstrap.
Ich habe eine erstellt Navigation.js Datei, die eine Klasse enthält Navigation die zu trennen Navbar und das Routing von der App.js Datei. Allerdings scheinen beide Teile nicht zu funktionieren. Wenn ich die Seite lade, ist sie einfach leer, es gibt keine Navigationsleiste. Kann jemand einen Fehler erkennen?
Ich habe es mit einem versucht NavItem enthält a LinkContainer aus react-router-bootstrap bereits, was zum gleichen Ergebnis führte.
Nur der Vollständigkeit halber, Page.js:
import React, { Component } from 'react';
import { Link } from 'react-router-dom';
export const Page = ({ title }) => (
<div className="App">
<div className="App-header">
<h2>{title}</h2>
</div>
<p className="App-intro">
This is the {title} page.
</p>
<p>
<Link to="https://stackoverflow.com/">Home</Link>
</p>
<p>
<Link to="/about">About</Link>
</p>
<p>
<Link to="/settings">Settings</Link>
</p>
</div>
);
export const About = (props) => (
<Page title="About"/>
);
export const Settings = (props) => (
<Page title="Settings"/>
);
export const Home = (props) => (
<Page title="Home"/>
);
Erstens sieht es in Ihren Snippets nicht so aus, als würden Sie Ihren Code in ein Paket verpacken Routeralso sollten Sie sicherstellen, dass Sie das im Inneren tun App oder in ReactDOM.render:
Als nächstes besteht Ihr spezifisches Problem darin, dass Sie React-Bootstraps rendern Nav.Link anstelle von React-Router Link Komponente, sodass der Router Ihre Routenänderungen nicht aufnimmt. Glücklicherweise bietet React-Bootstrap in den meisten seiner Komponenten eine Render-Requisite, um anzugeben, welche Komponente oder welches Element Sie rendern möchten, wenn Sie nicht die Standardeinstellung wünschen. Wechseln Sie zu etwas wie diesem:
Danke mein Herr! das as={Link} und to”…” war das, was mir gefehlt hat. Es ist seltsam, dass die Bootstrap-Dokumente dies überhaupt nicht erwähnen.
– mBrice1024
9. Mai 2020 um 15:41 Uhr
Es sieht so aus, als hätte das so sein sollen Nav.Item anstatt NavItem
– kugo2006
20. Okt. 2020 um 6:22 Uhr
@kugo2006 Es handelt sich um die gleiche Komponente, aber ja, es ist ein Import weniger erforderlich Nav.Item. Außerdem ging es um die Frage Nav.Link und der Router, und es sieht so aus, als hätte ich gerade den Ausschnitt aus der Frage von OP kopiert und ihn repariert, also habe ich nicht viel umgestaltet 🙂
– SrThompson
20. Okt. 2020 um 22:50 Uhr
Ich frage mich, wo ich das in den Dokumenten finden kann. Bitte fügt jemand einen Link zu den Dokumenten ein, wo dieser als Referenz erwähnt wird. Woher sollen wir wissen, dass es eine „as“-Eigenschaft gibt?
Für diejenigen, die ein Problem mit dem Styling haben Link Komponente aus react-router-dom Fügen Sie einfach in der React-Bootstrap-Navigationsleiste hinzu className="nav-link"so was:
<Link to="/" className="nav-link">Home</Link>
anstatt
<Nav.Link href="/">Home</Nav.Link>
Ich hatte auch das gleiche Problem, aber ich denke, es ist besser, stattdessen Folgendes zu verwenden: <Nav.Link as={Link} href="/">Home</Nav.Link> Wo {Link} ist die Komponente von react-router-dom.
– Matías Pizarro
5. Okt. 2019 um 21:06 Uhr
@MatíasP. Bei Verwendung as={Link} du musst ersetzen href mit to
– max
13. Januar 2020 um 6:24
Danke. Diese Antworten sind genau das, wonach ich gesucht habe <Link to="/" className="nav-link">Home</Link> ODER <Nav.Link as={Link} to="/" >Home</Nav.Link>
– K. Shaikh
27. Juni 2021 um 12:35 Uhr
Ich hoffe, ich bin nicht zu spät, um einigen anderen Leuten zu helfen, die versuchen, dieses Problem zu lösen.
Sie können den NavLink anstelle von as={Link} verwenden. Es wird mit dem gleichen Verhalten wie Link gerendert, „beobachtet“ jedoch die Router-URL, um zu definieren, welcher Link tatsächlich aktiv ist:
Dadurch wurde Folgendes behoben: <Link> außerhalb a <Router> Fehler für mich.
Derzeit funktioniert der Ansatz mit React v18 und React-Router v6.4 für mich etwas anders.
Damit die Links mit React-Route ordnungsgemäß funktionieren, verwenden Sie sie as={Link} im Nav.Link Artikel.
Und um die Registerkarten hervorzuheben, müssen Sie sie verwenden eventKey wie beschrieben in der Dokumentation: EventKey wird verwendet, um den aktiven Status des übergeordneten Nav zu bestimmen und zu steuern
Hier ist ein Beispiel.
Beachten Sie, dass sich die Änderungen auch auf die auswirken Navbar.Brand Komponente.
Perfekt! Danke. Diese APIs ändern sich so schnell, dass alles andere veraltet ist.
– Trees4theForest
25. November 2022 um 22:23 Uhr
Der Typ „{Link}“ kann nicht dem Typ „ElementType |“ zugewiesen werden nicht definiert’. Meinten Sie „Link“?
– Richard Barraclough
15. April um 7:31 Uhr
Nachdem ich mich mit einem Projekt von nicht trivialer Größe konfrontiert sah, das bereits jQuery als Abhängigkeit hatte, konnte ich die Nichtübereinstimmung zwischen React-Router und React-Bootstrap mit einem Event-Listener auf dem problemlos lösen document.
Dies hat gegenüber anderen Lösungen den Vorteil, dass keine Änderungen am aktuellen Markup erforderlich sind. Möglicherweise muss jedoch eine zusätzliche Logik zum Schutz geschrieben werden history.push je nach Bedarf anrufen. Möglicherweise muss dies auch erweitert werden, um den Schutz zu gewährleisten target Attribut, z.B target="_blank".
Wenn jQuery nicht gewünscht ist, kann man möglicherweise eine Vanilla-JS-Implementierung damit schreiben document.addEventListener ohne großen Mehraufwand.
// react-router@5
// usage of history may vary depending on version
import { Router } from 'react-router-dom';
import { createBrowserHistory } from 'history';
const history = createBrowserHistory();
// IIFE scoping jQuery for us
(($) => {
// Wait for document ready
$(() => {
$(document).on('click', '[href]', (event) => {
// Only target links targeting our application's origin
if (event.currentTarget.href.indexOf(window.location.origin) === 0) {
// Prevent standard browser navigation
event.preventDefault();
const path = event.currentTarget.href.slice(window.location.origin.length);
history.push(path);
}
});
});
})(jQuery);
const Routing = (props) => (
<Router history={ history }>
...
</Router>
);
Perfekt! Danke. Diese APIs ändern sich so schnell, dass alles andere veraltet ist.
– Trees4theForest
25. November 2022 um 22:23 Uhr
Der Typ „{Link}“ kann nicht dem Typ „ElementType |“ zugewiesen werden nicht definiert’. Meinten Sie „Link“?
– Richard Barraclough
15. April um 7:31 Uhr
ravibagul91
Ich glaube, Sie haben vergessen, Bootstrap-CSS einzuschließen. Weitere Informationen finden Sie im Abschnitt „Stylesheets“ im folgenden Dokument