代码之家  ›  专栏  ›  技术社区  ›  Raphael Rafatpanah

React Router v5-点击<Link/>不会重新渲染

  •  0
  • Raphael Rafatpanah  · 技术社区  · 4 年前

    据我所知,点击React Router <Link /> 组件应该导致内部的一切 <Router /> 重新渲染。

    然而,在这个使用React Router DOM v5.2的简单示例应用程序中,情况似乎并非如此:

    import React from "react";
    import "./styles.css";
    import { BrowserRouter as Router, Route, Link } from "react-router-dom";
    
    const Foo = () => {
      console.log("rendered");
      return null;
    };
    
    export default function App() {
      return (
        <Router>
          <Foo />
          <div className="App">
            <Link to="/">Home</Link>
            <br />
            <Link to="/foo">Foo</Link>
    
            <Route path="/" exact>
              <p>Home</p>
            </Route>
            <Route path="/foo">
              <p>Foo</p>
            </Route>
          </div>
        </Router>
      );
    }
    
    

    https://codesandbox.io/s/vigorous-water-2fuxt?file=/src/App.js

    我错过了什么?

    0 回复  |  直到 4 年前
        1
  •  2
  •   Drew Reese    4 年前

    如果你 事实上 提供 Foo 在有路径的路线上,当路径匹配时,它会重新感知。没有路径的路线将 总是 匹配并渲染,因此它在挂载时渲染,不会重新渲染,因为它没有道具也没有任何状态需要更新( 如果组件包含 Router 重新装载/更新 ).

    每次渲染一次 路由器

    <Route>
      <Foo />
    </Route>
    

    每条路径匹配重新渲染一次

    <Route path="/foo">
      <Foo />
    </Route>
    

    考虑一下这个演示

    const Foo = () => {
      console.log("rendered Foo");
      return null;
    };
    const Bar = () => {
      console.log("rendered Bar");
      return null;
    };
    
    export default function App() {
      const [c, setC] = useState(0);
    
      return (
        <Router>
          <Route>
            <Foo />
          </Route>
    
          <button onClick={() => setC(c => c + 1)}>Rerender Router</button>
    
          <div className="App">
            <Link to="/">Home</Link>
            <br />
            <Link to="/bar">Bar</Link>
    
            <Route path="/" exact>
              <p>Home</p>
            </Route>
            <Route path="/bar">
              <Bar />
            </Route>
          </div>
        </Router>
      );
    }
    

    Edit peaceful-chebyshev-2k8rc

        2
  •  0
  •   Gianfranco Fertino    4 年前

    据我所知,点击React Router <Link /> 组件应该导致内部的一切 <Router /> 重新渲染。

    <路由器/> 但是 <Route /> 仅当指定的路径与当前路径匹配时。

    孩子们 <路由器/> 将只渲染一次。