Reactjs 在异步函数的回调中设置状态

Reactjs 在异步函数的回调中设置状态,reactjs,Reactjs,我是新来的,所以请容忍我。我有一个组件调用另一个接受属性的组件。此属性将在函数的回调中获取其值,如下所示: render(){ myFunc((p) => { if(!_.isEqual(p, this.state.myProp)) this.setState({myProp: p}) }); return <MyComponent myProp={this.state.myProp}/> } myFunc将发出或不发出API请求,并根据该请

我是新来的,所以请容忍我。我有一个组件调用另一个接受属性的组件。此属性将在函数的回调中获取其值,如下所示:

render(){
  myFunc((p) => {
    if(!_.isEqual(p, this.state.myProp))
      this.setState({myProp: p})
  });
  return <MyComponent myProp={this.state.myProp}/> 
}
myFunc将发出或不发出API请求,并根据该请求迟早会调用回调。当发出API请求并且回调需要更长时间才能返回时,这似乎可以正常工作。但是,当不需要请求且回调立即返回或几乎返回时,我会收到一条警告:无法在现有状态转换期间更新,例如在“render”内。渲染方法应该是道具和状态的纯函数。 我做错了什么?正确的方法是什么?哪里是放置此代码的正确位置?基本上,我需要的是重新渲染myComponent,如果this.state.myProp发生更改

您不应该在render方法中调用setState,您可能最终会有一个无限循环。 根据您的业务逻辑,对myFunc的调用应该在其他地方。当函数完成时,它将更新状态,然后触发重新渲染,以便MyComponent获得最新的值

更新

我不知道哪些条件需要再次调用myFunc,但您可以执行以下操作:

state = {
  myProp: null // or some other value that MyComponent can handle as a null state
}

componentDidMount () {
  myFunc((p) => {
    if(!_.isEqual(p, this.state.myProp)) // This is needed only if you get null back from the callback and you don't want to perform an unnecesary state update
      this.setState({myProp: p})
  }
}

render(){
  const { myProp } = this.state
  // You can also do if (!myProp) return null  
  return <MyComponent myProp={myProp}/> 
}

不要从渲染中调用setState。使用componentDidMount、componentDidUpdate和/或事件处理程序来处理这些事情。我尝试过这两种方法都不起作用。ComponentDidUpdate在渲染后发生,componentDidMount只发生一次,我需要根据用户操作重新渲染多次p不等于this.state.myProp的上下文是什么?p来自哪里?此外,发布的代码无效,至少缺少一个右括号。使用p@chibis是的,但是什么被作为p传递到回调中呢?这正是我的问题,我应该从哪里调用myFunc呢。渲染似乎是唯一的好地方,但正如我所说,我是新的反应,所以我不知道。myFunc的目的是为传递给MyComponent的属性生成值是否需要更新数据?在什么情况下应该再次调用myFunc?渲染时始终调用myFunc。它接受一个回调,该回调使用一个用于设置this.state.myProp的值调用,如果它与当前值不同,如果您没有任何其他条件,例如:如果此其他字段更改,则我需要再次调用myFunc,因为它可能返回不同的数据,那么我的更新应该可以工作。是,这正是发生的事情。还有另一个字段/属性发生了更改,导致重新呈现,因此需要再次调用myFunc,因此componentDidMount对我不起作用