当前位置: 首页 > 知识库问答 >
问题:

在React16.7中,在调用setState之后,返回null的getDerivedStateFromProps也在更新状态

祖利
2023-03-14

在呈现组件之后,我调用updateResults方法,该方法调用setState,之后调用getDerivedState并返回null,state得到更新并调用render和componentDidUpdate。

根据文件,这不应该发生。有人能解释为什么会发生这种情况吗?

class Results extends React.Component{
  constructor(props){
    super(props);
    this.state = {"query":props.data.web_query,"other_fields":props.other_fields};
  }  

  static getDerivedStateFromProps(props, state) {

    if (state.query != props.data.web_query) {  
      console.log("Returning new state as expected");
      state.query = props.data.web_query;
      return state;
    }
    console.log("Returning null, shouldn't change state, but changing");

    return null;
 }

  componentDidUpdate() {
    console.log("Componenent Did update");
  }

  updateResults(){
       let results = someAjaxCall(); 
       this.setState({"query":results.data.webquery,
                      "other_fields":results.other_fields});

  }

  render(){
      <SomeComponent updateCall={this.updateResults}/>
   }
}

另外,请解释setState是如何与getDerivedStateFromProps&shouldComponentUpdate相关的?

共有1个答案

陶淳
2023-03-14

我想您没有理解getDerivedStateFromProps()的目的

此方法用于在道具更改时更新状态。

即使在setState之后调用该方法,如果getDerivedStateFromProps返回null,则将使用setState中的数据更新状态,但getDerivedStateFromProps可以重写某些属性。

 类似资料:
  • React引入了新的静态方法,它在每个呈现方法之前都会被调用,但为什么呢?在prop change之后调用它对我来说是有意义的,但是在之后调用它就没有意义了,也许我错过了什么。 我根据公司的要求创建了一个组件,在组件中日期是从道具控制的。我在组件中有以下状态。 是的,我在中创建了一个额外的变量来跟踪是否由于而被调用,但我认为这不是正确的方法。 或者是我做错了什么或者遗漏了什么,或者不应该在之后调用

  • 我不熟悉react native,我在这里尝试在加载组件时更新状态。但是,状态没有更新。 我做错了什么?

  • 我不确定我是否滥用了基于交互的测试,或者我是否做了一些概念上的错误。我正在开发一个Spring Boot应用程序(Kotlin),我的测试使用的是Spock/Groovy。 我有一个正在测试的类,它调用另一个服务来查询信息。被测试的类应该缓存结果。但是,我不能用返回值模拟一个方法并检查调用的次数,因为当我添加调用检查时,被模拟的方法总是返回null。 我创建了一个独立的示例,演示了这个问题。 前两

  • 我有一个节点JSAPI,在这里我通过函数获取数据库数据。它工作完美,并发送我的结果。使用React和Axios,我获得了数据,但只要我将数据传递到中,它就会发送。 这是我的API函数 这是我的Axios和 返回这个 而返回此

  • 问题内容: 我有一个包含10个元素的div,这些元素将被逐个更新,延迟时间为2秒。下面是相同的代码 但是,当我运行它时,所有元素都会一起更新。该程序只是添加一个延迟添加一个开始,并且所有元素都一起更新(被标记)。如何制作代码来逐一标记元素? 问题答案: 您正在打破React的两个基本规则: 不要直接改变状态 如果根据现有状态更新状态,请使用回调形式,因为状态更新可能是异步的(无论如何,在您的示例中

  • 我有两门课。在一节课上,我创建并发起了一个活动,如下所示: 客户添加类 MyWindow类 现在,当我从类调用方法时,(当我订阅方法到事件时),不会被调用。调试器显示为空。我搜索了几个小时,没有找到解决办法。我跟随了这个链接,但仍然为空。如有任何指导/帮助,将不胜感激。