React and antd:路由器不重新渲染组件 [英] React and antd: Router doesn't re-render components

查看:79
本文介绍了React and antd:路由器不重新渲染组件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的网页,其中包含登录页面和搜索页面.我还在顶部有一个导航栏,可以在两者之间进行切换.基本的 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆