Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使子对象在父对象状态更改时不刷新_Javascript_Reactjs - Fatal编程技术网

Javascript 使子对象在父对象状态更改时不刷新

Javascript 使子对象在父对象状态更改时不刷新,javascript,reactjs,Javascript,Reactjs,这就是我的问题。我有一个根组件,其中包含导航和切换,每个组件都在我的页面中。导航是从左侧滑入滑出的,我这样做的方式是,更改根组件中的状态,将道具传递给,并决定是否应该向导航添加类。问题是,我的应用程序中的每个组件在打开/关闭nav时都会重新渲染。这是我的根组件: class App extends Component { constructor(props) { super(props); this.state = { navOpen: false }

这就是我的问题。我有一个根组件,其中包含导航和切换,每个组件都在我的页面中。导航是从左侧滑入滑出的,我这样做的方式是,更改根组件中的状态,将道具传递给,并决定是否应该向导航添加类。问题是,我的应用程序中的每个组件在打开/关闭nav时都会重新渲染。这是我的根组件:

class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      navOpen: false
    }
  }
  toggleNav = () => {
    this.setState({
      navOpen: !this.state.navOpen
    })
  }
  closeNav = (e) => {
    if (this.state.navOpen) {
      this.setState({navOpen: false})
    }
  }

  render() {
    return (
      <main>
        <Header/>
        <Hamburger navOpen={this.state.navOpen} toggleNav={this.toggleNav}/>
        <Navigation navOpen={this.state.navOpen} toggleNav={this.toggleNav}/>
        <section className="container-fluid content" onClick={this.closeNav}>
          <Switch>
            <Route path="/add-recipe/:groupId?" component={NewRecipe}/>
            <Route path="/recipes/:page?/:sortType?/:size?" component={RecipeList}/>
            <Route path="/recipe/:id" component={Recipe}/>
            <Route path="/sign/" component={SignForm}/>
            <Route path="/user/:id" component={User}/>
          </Switch>
        </section>
      </main>

    );
  }
  componentDidMount() {
    this.props.userActions.getUser(this.props.url);
  }
}

function mapStateToProps(state) {
  return {url: state.url.url, user: state.user.loggedUser}
}

function mapDispatchToProps(dispatch) {
  return {
    userActions: bindActionCreators(userActions, dispatch)
  }
}

export default withRouter(connect(mapStateToProps, mapDispatchToProps)(App));

但这并没有改变任何事情。当我打开导航道具的路线保持不变,但他们仍然重新招标。我试图将“navOpen”状态移动到navigation,并通过“ref”从根组件打开它,但每次调用它的方法时,我都会得到“无法读取null的属性'toggleNav'”

您可以通过在受影响的组件上实现
shouldComponentUpdate
来防止重新渲染。不过要注意,渲染并不意味着DOM正在更改。react中的呈现意味着react将创建其内部节点树的新副本,并将其与DOM进行比较,以确定是否需要更新它,以及在何处进行更新。因此,不要担心重新渲染,除非您的组件创建成本很高(即,它执行对后端的请求或设置了大量动画)

您可能需要查看shouldComponentUpdate生命周期方法:这可能有助于详细回答您的问题。可能重复的
shouldComponentUpdate(nextProps, nextState) {
    // console.log(this.props)
    // console.log("next")
    // console.log(nextProps)
    if (this.props == nextProps) {
      return false
    }
    return true
  }