React and antd:路由器不重新渲染组件 [英] React and antd: Router doesn't re-render components
问题描述
我有一个简单的网页,其中包含登录页面和搜索页面.我还在顶部有一个导航栏,可以在两者之间进行切换.基本的 App.js
如下所示:
I have a simple web page with login and search pages. I also have a navbar at the top to allow for switching between the two. The basic App.js
looks as follows:
const history = createBrowserHistory();
function App() {
return (
<Router history={history}>
<CustomLayout>
<Switch>
<BaseRouter/>
</Switch>
</CustomLayout>
</Router>
);
}
export default App;
现在, BaseRouter
和 CustomLayout
只是
const BaseRouter = () => (
<div>
<Route exact path={"/list"} component={ItemsList}/>
<Route path={"/login"} component={LoginForm}/>
</div>
);
export default BaseRouter;
和
const CustomLayout = ({children}) => {
return(
<>
<Navbar/>
{children}
</>
);
}
export default CustomLayout;
现在,导航栏看起来像这样
Now, the navbar looks like this
import React from "react";
import {Menu} from 'antd';
import {Link} from "react-router-dom";
const Navbar = () => {
return (
<div>
<Menu mode="horizontal" theme={"dark"}>
<Menu.Item key="list">
<Link to={"/list"}>List</Link>
</Menu.Item>
<Menu.Item key={"login"}>
<Link to={"/login"}>Sign in</Link>
</Menu.Item>
</Menu>
</div>
);
}
export default Navbar
让组件保持简单:
const Login = () => {
return (
<div>
login
</div>
);
}
export default Login
const List = () => {
return (
<div>
list
</div>
);
}
export default List
现在的问题是,当我单击导航栏中的链接时,即使路由发生了变化,React也不会重新渲染组件.我已经看到了数百种关于SO的答案,但是我仍然无法弄清楚.
注意
对我来说,避免刷新或重新加载页面很重要.
编辑
奇怪的是,当我将 Router
更改为 BrowserRotuer
时,它可以正常工作,但那时我无法使用自己的历史记录.
Now the problem is that when I click on links in the navbar, React doesn't re-render components even though the route changes. I've seen hundreds of answers on SO but I still can't figure it out.
NOTE
It is important for me to avoid refreshing or reloading the page.
EDIT
Strangely enough, when I change Router
to BrowserRotuer
it works fine, but I can't use my own history then.
推荐答案
为什么不使用 react-router-dom
包中的 BrowserRouter
.
-
App.js
:-使用react-router-dom
中的
BrowserRouter
import { BrowserRouter as Router, Switch } from 'react-router-dom'
function App() {
return (
<Router>
<CustomLayout>
<Switch>
<BaseRouter/>
</Switch>
</CustomLayout>
</Router>
);
}
export default App;
-
BaseRouter.js
:-从react-router-dom
导入
Route
import { Route } from 'react-router-dom'
const BaseRouter = () => (
<div>
<Route exact path="/list" component={ItemsList}/>
<Route path="/login" component={LoginForm}/>
</div>
);
export default BaseRouter;
-
Navbar.js
:-
import React from "react";
import {Menu} from 'antd';
import {Link} from "react-router-dom";
const Navbar = () => {
return (
<div>
<Menu mode="horizontal" theme={"dark"}>
<Menu.Item key={"list"}>
<Link to="/list">List</Link>
</Menu.Item>
<Menu.Item key={"login"}>
<Link to="/login">Sign in</Link>
</Menu.Item>
</Menu>
</div>
);
}
export default Navbar
然后,如果您想使用历史记录
:-
then if you want to use history
:-
import { useHistory } from 'react-router-dom'
const testFunctionComponent = () => {
const history = useHistory()
const handleClick = (urlPath) => {
// you can do
history.push(urlPath) // to go anywhere
}
return (
<>
<button onClick={() => handleClick('/anypath')}>Click Me!<button>
</>
)
}
这篇关于React and antd:路由器不重新渲染组件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!