react-router-dom 不在路由更改时渲染组件
react-router-dom not rendering components on route change
如果我单击导航 link,我可以看到 slug 已更改但组件未呈现。我必须手动刷新页面才能看到该组件,而页面应该在 route/slug 更改时自行重新呈现。
App.js
import React, { Component } from 'react';
import { BrowserRouter, Switch, Route } from 'react-router-dom';
import Me from './components/me';
import Contrib from './components/contrib';
import Projects from './components/projects';
import Contact from './components/contact';
class App extends Component {
render() {
return (
<div className="container">
<BrowserRouter>
<Switch>
<Route exact path="/" component={Me} />
<Route path="/contrib" component={Contrib} />
<Route path="/projects" component={Projects} />
<Route path="/contact" component={Contact} />
</Switch>
</BrowserRouter>
</div>
);
}
}
header.jsx
import { BrowserRouter, NavLink} from 'react-router-dom';
const Header = () => {
return (
<div className="container">
<div id="logo">
<img src={Earth} alt="placeholdit" className="rounded" />
</div>
<nav>
<BrowserRouter>
<ul>
<li><NavLink to="/">Home</NavLink></li>
<li><NavLink to="/contrib">Contributions</NavLink></li>
<li><NavLink to="/projects">Projects</NavLink></li>
<li><NavLink to="/contact">Contact</NavLink></li>
<li></li>
</ul>
</BrowserRouter>
</nav>
</div>
)
}
如果我从 header.jsx
中删除 <BrowserRouter>
,我会收到一条错误消息:"You should not use <Route>
or withRouter()
outside a <Router>
"。
如果在 header.jsx
中添加 <BrowserRouter>
错误消失,但组件不会在 route/slug 更改时呈现。
您需要环绕最高阶组件才能使其按预期工作。如果您的应用程序很简单,请将其包装在 ReactDOM.render 方法中。像这样
ReactDOM.render((
<BrowserRouter>
<App/>
</BrowserRouter>),
document.getElementById('root'))
我遇到了同样的问题。从 header.jsx 中删除并将其放入您的 index.js 中,如下所示:
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>
, document.getElementById('root'));
注意路由、交换机和的顺序路由器。我遵循此命令,它对我有用。
注意:尝试使用箭头功能
import React from "react";
import { Switch, Route, Router } from "react-router-dom";
// Containers
import { Dashboard, CardPayment } from "../Containers";
const history = createBrowserHistory();
const ReactRouter = () => {
return (
<Router history={history}>
<Switch>
<Route path="/dashboard" component={Dashboard} exact={true} />
<Route path="/card-payment" component={CardPayment} exact={true} />
<Route path="/" component={Dashboard} exact={true} />
</Switch>
</Router>
);
};
export default ReactRouter;
在我的例子中,使用了路由器,降级“历史”库解决了问题。
app.tsx
<Router history={history}>
<Switch>
<Route exact path={`${AppRoute.ALBUMS}/:author/:album`} component={PhotosPage}/>
<Route exact path={`${AppRoute.ALBUMS}/:id`} component={AlbumsPage}/>
<Route path={AppRoute.ERROR} component={ErrorPage}/>
<Route path={AppRoute.ROOT} component={AuthorsPage}/>
</Switch>
</Router>
我项目中的版本:
package.json:
...
"history": "4.10.1",
"react-router-dom": "5.2.0",
...
“历史”库最初是版本“5.0.0”
<Link to ={"/home"}>Home</Link>
以我为例
我忘了在“to”参数中添加括号然后它正在渲染组件
对于无法修复此错误的人
第一步:确保高阶组件被Router包裹。在上面的问题中已经完成了。
class App extends Component {
render() {
return (
<div className="container">
<BrowserRouter>
<Switch>
<Route exact path="/" component={Me} />
<Route path="/contrib" component={Contrib} />
<Route path="/projects" component={Projects} />
<Route path="/contact" component={Contact} />
</Switch>
</BrowserRouter>
</div>
);
}
}
让我们考虑 <Header/>
位于 <Route/>
中的任何组件内
第 2 步:如果高阶组件已经用 Router
包裹,如果您不想在 <Header/>
内单独路由,也不要包裹 <Header/>
。
import { NavLink} from 'react-router-dom';
const Header = () => {
return (
<div className="container">
<div id="logo">
<img src={Earth} alt="placeholdit" className="rounded" />
</div>
<nav>
<ul>
<li><NavLink to="/">Home</NavLink></li>
<li><NavLink to="/contrib">Contributions</NavLink></li>
<li><NavLink to="/projects">Projects</NavLink></li>
<li><NavLink to="/contact">Contact</NavLink></li>
<li></li>
</ul>
</nav>
</div>
)
}
如果我单击导航 link,我可以看到 slug 已更改但组件未呈现。我必须手动刷新页面才能看到该组件,而页面应该在 route/slug 更改时自行重新呈现。
App.js
import React, { Component } from 'react';
import { BrowserRouter, Switch, Route } from 'react-router-dom';
import Me from './components/me';
import Contrib from './components/contrib';
import Projects from './components/projects';
import Contact from './components/contact';
class App extends Component {
render() {
return (
<div className="container">
<BrowserRouter>
<Switch>
<Route exact path="/" component={Me} />
<Route path="/contrib" component={Contrib} />
<Route path="/projects" component={Projects} />
<Route path="/contact" component={Contact} />
</Switch>
</BrowserRouter>
</div>
);
}
}
header.jsx
import { BrowserRouter, NavLink} from 'react-router-dom';
const Header = () => {
return (
<div className="container">
<div id="logo">
<img src={Earth} alt="placeholdit" className="rounded" />
</div>
<nav>
<BrowserRouter>
<ul>
<li><NavLink to="/">Home</NavLink></li>
<li><NavLink to="/contrib">Contributions</NavLink></li>
<li><NavLink to="/projects">Projects</NavLink></li>
<li><NavLink to="/contact">Contact</NavLink></li>
<li></li>
</ul>
</BrowserRouter>
</nav>
</div>
)
}
如果我从 header.jsx
中删除 <BrowserRouter>
,我会收到一条错误消息:"You should not use <Route>
or withRouter()
outside a <Router>
"。
如果在 header.jsx
中添加 <BrowserRouter>
错误消失,但组件不会在 route/slug 更改时呈现。
您需要环绕最高阶组件才能使其按预期工作。如果您的应用程序很简单,请将其包装在 ReactDOM.render 方法中。像这样
ReactDOM.render((
<BrowserRouter>
<App/>
</BrowserRouter>),
document.getElementById('root'))
我遇到了同样的问题。从 header.jsx 中删除并将其放入您的 index.js 中,如下所示:
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>
, document.getElementById('root'));
注意路由、交换机和的顺序路由器。我遵循此命令,它对我有用。 注意:尝试使用箭头功能
import React from "react";
import { Switch, Route, Router } from "react-router-dom";
// Containers
import { Dashboard, CardPayment } from "../Containers";
const history = createBrowserHistory();
const ReactRouter = () => {
return (
<Router history={history}>
<Switch>
<Route path="/dashboard" component={Dashboard} exact={true} />
<Route path="/card-payment" component={CardPayment} exact={true} />
<Route path="/" component={Dashboard} exact={true} />
</Switch>
</Router>
);
};
export default ReactRouter;
在我的例子中,使用了路由器,降级“历史”库解决了问题。
app.tsx
<Router history={history}>
<Switch>
<Route exact path={`${AppRoute.ALBUMS}/:author/:album`} component={PhotosPage}/>
<Route exact path={`${AppRoute.ALBUMS}/:id`} component={AlbumsPage}/>
<Route path={AppRoute.ERROR} component={ErrorPage}/>
<Route path={AppRoute.ROOT} component={AuthorsPage}/>
</Switch>
</Router>
我项目中的版本:
package.json:
...
"history": "4.10.1",
"react-router-dom": "5.2.0",
...
“历史”库最初是版本“5.0.0”
<Link to ={"/home"}>Home</Link>
以我为例 我忘了在“to”参数中添加括号然后它正在渲染组件
对于无法修复此错误的人
第一步:确保高阶组件被Router包裹。在上面的问题中已经完成了。
class App extends Component {
render() {
return (
<div className="container">
<BrowserRouter>
<Switch>
<Route exact path="/" component={Me} />
<Route path="/contrib" component={Contrib} />
<Route path="/projects" component={Projects} />
<Route path="/contact" component={Contact} />
</Switch>
</BrowserRouter>
</div>
);
}
}
让我们考虑 <Header/>
位于 <Route/>
第 2 步:如果高阶组件已经用 Router
包裹,如果您不想在 <Header/>
内单独路由,也不要包裹 <Header/>
。
import { NavLink} from 'react-router-dom';
const Header = () => {
return (
<div className="container">
<div id="logo">
<img src={Earth} alt="placeholdit" className="rounded" />
</div>
<nav>
<ul>
<li><NavLink to="/">Home</NavLink></li>
<li><NavLink to="/contrib">Contributions</NavLink></li>
<li><NavLink to="/projects">Projects</NavLink></li>
<li><NavLink to="/contact">Contact</NavLink></li>
<li></li>
</ul>
</nav>
</div>
)
}