Благодаря пониманию, предоставленному другими ответами, я смог найти решение, которое удовлетворит все мои потребности.
Вот мои обновленные файлы. Первый - мой корневой index
файл. В качестве меры предосторожности я заменил все экземпляры import {Router} from 'react-router'
на import {BrowserRouter as Router} from 'react-router-dom'
, что было предложено ответом на этот вопрос . Замена всех экземпляров react-router
на react-router-dom
помогла остановить ошибки You should not use <Switch> outside a <Router>
или You should not use <Route> outside a <Router>
.
<Provider store={store}>
<Router history={browserHistory} store={store}>
<App/>
</Router>
</Provider>
Мои маршруты / индекс.
const Routes = ({ history, store }) => {
return (
<Switch>
<Route exact path="/" component={Home} />
<Route exact path="/404" component={NotFound} />
<Route exact path="/games" component={Games} />
<Route exact path="/account" render={accountDetails}/>
<Route path="/games/:id" render={getGame} />
<Route exact path="/login" component={LoginSignUp} />
<Redirect to='404' />
</Switch>
);
};
И приложение теперь включает в себяниже.
import Routes from './routes/index.js';
class App extends React.Component {
state = {
loggedIn: true
};
render(){
return (
<div className="App">
<Header/>
<Routes/>
</div>
);
}
}
Сначала я решил взять App
из routes/index
. Я основал мою исходную иерархию маршрутов, основанную на другом проекте, который не использовал react-router 4
. Вот почему в другом проекте вложенные маршруты под маршрутом App
достигли того, что я пытался. В react router 4
это было невозможно , следовательно, ошибка Cannot use Link outside of Router
. Поэтому вместо этого я обернул App
в Router
в моем корневом индексном файле, затем обернул все другие маршруты в Switch
в моем routes/index
файле и импортировал их в App
. App
теперь может использовать Маршрутизатор для компонента Header
, а также для других маршрутов, включенных в Switch
.
Это также решило мою проблему за то, что пришлось пожертвовать exact path
ради App
. Поскольку я хотел использовать Header
на каждой странице, я хотел, чтобы App
был на каждой странице. Использование exact path
помешало мне сделать это. Это также помешало мне использовать '/' для рендеринга Home
. Когда я сделал App
exact path
равным path
, я смог сделать это, но можно было ввести любой случайный необъявленный маршрут. Например, localhost:3000/poop
не будет отображать NotFound
, как я планировал,это просто ничего не сделает.
В итоге, переместив App
из routes/index
, он позволил мне обернуть его в каталог Router
в корневом индексном файле. Затем, импортировав Routes
в App
, я смог позволить своему приложению ориентироваться на маршрут, сохраняя при этом Header
на всех страницах. Кроме того, обернув все мои маршруты в Switch
и имея корневой путь равный exact path
, я мог правильно обрабатывать неизвестные пути и отображать компонент NotFound
, используя <Redirect to='404' />
.