当父组件状态更改时,React路由组件会重新渲染

年轻的太阳

在App.js中,我将状态和函数传递给Header.js,SideDrawer.js,Footer.js作为道具。每当App.js的状态发生变化(即,当我单击Header.js上的链接时),Home.js都会重新渲染(我没有将任何内容传递给Home.js),这正常吗?如何防止Home.js重新呈现?

我曾尝试将Home Component(它是一个类组件)更改为PureComponent,但是当App的状态更改时,它仍然会重新渲染。

App.js

class App extends React.Component {
  state = {
    sideDrawerOpen: false,
    subMenuOpen: false,
    modalOpen: false
  };

  componentDidMount() {
    store.dispatch(loadUser());
  }

  sideDrawerOpenHandler = () => {
    this.setState(prevState => {
      return { sideDrawerOpen: !prevState.sideDrawerOpen };
    });
  };

  sideDrawerCloseHandler = () => {
    this.setState({
      sideDrawerOpen: false
    });
  };

  subMenuOpenHandler = () => {
    this.setState(
      prevState => {
        return { subMenuOpen: !prevState.subMenuOpen };
      },
      () => {
        document.addEventListener("click", this.subMenuCloseHandler);
      }
    );
  };

  subMenuCloseHandler = () => {
    this.setState(
      {
        subMenuOpen: false
      },
      () => {
        document.removeEventListener("click", this.subMenuCloseHandler);
      }
    );
  };

  modalOpenHandler = () => {
    this.setState(prevState => {
      return { modalOpen: !prevState.modalOpen };
    });
  };
  modalCloseHandler = () => {
    this.setState({
      modalOpen: false
    });
  };

  render() {
    let backDrop;

    if (this.state.sideDrawerOpen || this.state.modalOpen) {
      backDrop = (
        <Backdrop
          sideDrawerCloseHandler={this.sideDrawerCloseHandler}
          subMenuCloseHandler={this.subMenuCloseHandler}
          modalCloseHandler={this.modalCloseHandler}
        />
      );
    }

    return (
      <Provider store={store}>
        <AlertProvider template={AlertTemplate} {...alertOptions}>
          <Router>
            <Header
              sideDrawerOpenHandler={this.sideDrawerOpenHandler}
              subMenuOpenHandler={this.subMenuOpenHandler}
              subMenuOpen={this.state.subMenuOpen}
              // subMenuCloseHandler={this.subMenuCloseHandler}
            />
            <Alerts />
            {this.state.modalOpen && (
              <Trivia modalCloseHandler={this.modalCloseHandler} />
            )}
            <SideDrawer
              sideDrawerOpen={this.state.sideDrawerOpen}
              sideDrawerCloseHandler={this.sideDrawerCloseHandler}
              subMenuOpenHandler={this.subMenuOpenHandler}
              subMenuOpen={this.state.subMenuOpen}
              subMenuCloseHandler={this.subMenuCloseHandler}
            />
            {backDrop}
            <Footer
              modalOpenHandler={this.modalOpenHandler}
              subMenuCloseHandler={this.subMenuCloseHandler}
            />
            <main>
              <Switch>
                <Route exact path="/" component={Home} />
                <Route path="/roster/lakers" component={Lakers} />
                <Route path="/roster/celtics" component={Celtics} />
                <Route path="/roster/rockets" component={Rockets} />
                <Route path="/roster/raptors" component={Raptors} />
                <Route path="/roster/clippers" component={Clippers} />
                <Route path="/roster/bucks" component={Bucks} />
                <Route path="/login" component={Login} />
                <Route path="/register" component={Register} />
              </Switch>
            </main>
          </Router>
        </AlertProvider>
      </Provider>
    );
  }
}
乔茨赫达

当父视图重新渲染时,所有可见的子视图也会重新渲染。您可以将家庭组件包装在React.memo中(如果它是功能组件),或者使用shouldComponentUpdate生命周期方法(如果是类)。这样可以防止不必要的重新渲染。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

当父状态在React中更改时停止渲染子组件

来自分类Dev

反应组件不会在父组件 firebase 的状态更改时重新渲染

来自分类Dev

路由更改时,可以避免重新渲染父路由处理程序组件吗?

来自分类Dev

路由更改时,是否可以避免重新渲染父路由处理程序组件?

来自分类Dev

由于父级重新渲染,ReactJS计算组件道具更改时的状态

来自分类Dev

当 prop 更改时,无状态组件不会重新渲染

来自分类Dev

React 组件不会使用 setState 在状态更改时重新渲染

来自分类Dev

数组属性更改时,React子组件不会重新渲染

来自分类Dev

React:子组件未在父状态更改时呈现

来自分类Dev

React组件不会在状态更改时重新呈现

来自分类Dev

重新渲染时,react组件会重置其状态吗?

来自分类Dev

当RN 0.61中的状态更改时,如何从主组件中重新渲染子组件?

来自分类Dev

在重新渲染父组件时,React如何重用子组件/保持子组件的状态?

来自分类Dev

功能组件在状态更改时重新呈现

来自分类Dev

React组件道具的更改是否会导致重新渲染?

来自分类Dev

在React中重新渲染子组件或更改子状态

来自分类Dev

状态更改时,React不会重新渲染

来自分类Dev

状态更改后从子组件重新渲染

来自分类Dev

更改存储状态后重新渲染组件

来自分类Dev

状态更改不重新渲染组件

来自分类Dev

反应:如何在某些特定状态更改时停止重新渲染组件?

来自分类Dev

如何在状态更改时重新渲染组件的一部分?

来自分类Dev

React挂钩:父组件无法重新渲染

来自分类Dev

从React中的父路由组件加载状态

来自分类Dev

React 重新渲染重置组件的悬停状态

来自分类Dev

强制组件在路由更改或 vuex 状态更改时重建

来自分类Dev

当Redux状态更改时,React-Redux渲染组件在屏幕上出现两次

来自分类Dev

React Native:基于Array.map()的渲染组件不会在状态更改时更新

来自分类Dev

当Redux状态更改时,React-Redux渲染组件在屏幕上出现两次

Related 相关文章

  1. 1

    当父状态在React中更改时停止渲染子组件

  2. 2

    反应组件不会在父组件 firebase 的状态更改时重新渲染

  3. 3

    路由更改时,可以避免重新渲染父路由处理程序组件吗?

  4. 4

    路由更改时,是否可以避免重新渲染父路由处理程序组件?

  5. 5

    由于父级重新渲染,ReactJS计算组件道具更改时的状态

  6. 6

    当 prop 更改时,无状态组件不会重新渲染

  7. 7

    React 组件不会使用 setState 在状态更改时重新渲染

  8. 8

    数组属性更改时,React子组件不会重新渲染

  9. 9

    React:子组件未在父状态更改时呈现

  10. 10

    React组件不会在状态更改时重新呈现

  11. 11

    重新渲染时,react组件会重置其状态吗?

  12. 12

    当RN 0.61中的状态更改时,如何从主组件中重新渲染子组件?

  13. 13

    在重新渲染父组件时,React如何重用子组件/保持子组件的状态?

  14. 14

    功能组件在状态更改时重新呈现

  15. 15

    React组件道具的更改是否会导致重新渲染?

  16. 16

    在React中重新渲染子组件或更改子状态

  17. 17

    状态更改时,React不会重新渲染

  18. 18

    状态更改后从子组件重新渲染

  19. 19

    更改存储状态后重新渲染组件

  20. 20

    状态更改不重新渲染组件

  21. 21

    反应:如何在某些特定状态更改时停止重新渲染组件?

  22. 22

    如何在状态更改时重新渲染组件的一部分?

  23. 23

    React挂钩:父组件无法重新渲染

  24. 24

    从React中的父路由组件加载状态

  25. 25

    React 重新渲染重置组件的悬停状态

  26. 26

    强制组件在路由更改或 vuex 状态更改时重建

  27. 27

    当Redux状态更改时,React-Redux渲染组件在屏幕上出现两次

  28. 28

    React Native:基于Array.map()的渲染组件不会在状态更改时更新

  29. 29

    当Redux状态更改时,React-Redux渲染组件在屏幕上出现两次

热门标签

归档