Щоразу, коли ви намагаєтесь показати Link
на сторінці, яка знаходиться за межами, BrowserRouter
ви отримаєте цю помилку.
Це повідомлення про помилку, по суті, говорить про те, що будь-який компонент, який не є нашим дочірнім <Router>
елементом, не може містити жодних компонентів React Router.
Вам потрібно перенести ієрархію компонентів на те, як ви бачите це у першій відповіді вище. Для тих, хто переглядає цю публікацію, можливо, доведеться поглянути на інші приклади.
Скажімо, у вас є Header.js
компонент, який виглядає так:
import React from 'react';
import { Link } from 'react-router-dom';
const Header = () => {
return (
<div className="ui secondary pointing menu">
<Link to="/" className="item">
Streamy
</Link>
<div className="right menu">
<Link to="/" className="item">
All Streams
</Link>
</div>
</div>
);
};
export default Header;
І ваш App.js
файл виглядає так:
import React from 'react';
import { BrowserRouter, Route, Link } from 'react-router-dom';
import StreamCreate from './streams/StreamCreate';
import StreamEdit from './streams/StreamEdit';
import StreamDelete from './streams/StreamDelete';
import StreamList from './streams/StreamList';
import StreamShow from './streams/StreamShow';
import Header from './Header';
const App = () => {
return (
<div className="ui container">
<Header />
<BrowserRouter>
<div>
<Route path="/" exact component={StreamList} />
<Route path="/streams/new" exact component={StreamCreate} />
<Route path="/streams/edit" exact component={StreamEdit} />
<Route path="/streams/delete" exact component={StreamDelete} />
<Route path="/streams/show" exact component={StreamShow} />
</div>
</BrowserRouter>
</div>
);
};
export default App;
Зверніть увагу, що Header.js
компонент використовує Link
тег з, react-router-dom
але компонетка була розміщена за межами <BrowserRouter>
, це призведе до тієї ж помилки, що і досвід роботи з OP. У цьому випадку ви можете зробити виправлення одним рухом:
import React from 'react';
import { BrowserRouter, Route } from 'react-router-dom';
import StreamCreate from './streams/StreamCreate';
import StreamEdit from './streams/StreamEdit';
import StreamDelete from './streams/StreamDelete';
import StreamList from './streams/StreamList';
import StreamShow from './streams/StreamShow';
import Header from './Header';
const App = () => {
return (
<div className="ui container">
<BrowserRouter>
<div>
<Header />
<Route path="/" exact component={StreamList} />
<Route path="/streams/new" exact component={StreamCreate} />
<Route path="/streams/edit" exact component={StreamEdit} />
<Route path="/streams/delete" exact component={StreamDelete} />
<Route path="/streams/show" exact component={StreamShow} />
</div>
</BrowserRouter>
</div>
);
};
export default App;
Будь ласка, уважно перегляньте і переконайтеся, <Header />
що ваш компонент або будь-який інший компонент може бути всередині не тільки, <BrowserRouter>
але і всередині <div>
, інакше ви також отримаєте помилку про те, що маршрутизатор може мати лише одну дочірню структуру, яка стосується <div>
дочірньої <BrowserRouter>
. Все інше, таке як Route
і компоненти, повинно входити в нього за ієрархією.
Так що тепер <Header />
дитина з <BrowserRouter>
всередині <div>
тегів , і він може успішно використовувати в Link
елементі.
react-router
, оскільки ви використовуєте різні підходи для маршрутизації індексів.