React useEffect 不会在路由更改时触发

新手上路,请多包涵

我希望 console.log('Refresh') 在每次路由更改(从 Component1 切换到 Component2)时运行。但它只在第一次渲染时触发。为什么?

index.js

 import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { BrowserRouter } from 'react-router-dom';

ReactDOM.render(<BrowserRouter><App /></BrowserRouter>, document.getElementById('root'));

App.js

 import React, { useEffect } from 'react';
import { Switch, Route } from 'react-router-dom';
import Nav from './Nav';
import Component1 from './Component1';
import Component2 from './Component2';

const App = () => {

  useEffect( () => console.log('Refresh'));

  return (
        [<Switch>
            <Route                            component = {Nav}/>
        </Switch>,
        <Switch>
            <Route exact path = '/component1' component = {Component1}/>
            <Route exact path = '/component2' component = {Component2}/>
        </Switch>]
  );
}

export default App;

Nav.js

 import React from 'react';
import { Link } from 'react-router-dom';

const  Nav = () => {
  return (
    <div>
        <Link to = '/component1'>Component 1</Link>
        <Link to = '/component2'>Component 2</Link>
    </div>
  );
}

export default Nav;

Component1.js

 import React from 'react';

const  Component1 = () => {

  return (
    <div>
        <p>Hi</p>
    </div>
  );
}

export default Component1;

Component2.js

 import React from 'react';

const  Component2 = () => {
  return (
    <div>
        <p>Bye</p>
    </div>
  );
}

export default Component2;

原文由 Erik Martín Jordán 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 906
2 个回答

useEffect 没有被触发,因为 App 组件没有重新渲染,该组件没有任何变化(没有状态或道具更新)。

如果您希望 App 组件在路由更改时重新渲染,您可以使用 withRouter HOC 注入路由道具,如下所示:

 import { Switch, Route, withRouter } from 'react-router-dom';

const App = () => {

  useEffect( () => console.log('Refresh'));

  return (...);
}

export default withRouter(App);

示例: https://codesandbox.io/s/youthful-pare-n8p1y

原文由 Mohamed Ramrami 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 key 属性,所以每次我们渲染新组件(不同的键)

 <Route path='/mypath/:username' exact render= {routeProps =><MyCompo {...routeProps} key={document.location.href} />} />

原文由 Aliens Dev 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题