Reactjs 为什么我能';即使有条件,也不能从componentDidUpdate内部设置状态?

Reactjs 为什么我能';即使有条件,也不能从componentDidUpdate内部设置状态?,reactjs,Reactjs,我正在比较componentdiddupdate中的道具,并尝试更新状态,然后获取一些数据(这取决于一些状态参数) 但是,正如问题所示,当我要获取数据时,函数使用的是前一个状态 沙箱: 要评估错误,请执行以下操作:使用导航栏搜索其中一个实体。检查控制台以查看状态。在导航栏中对同一实体进行另一次搜索。再次检查控制台,查看未更改的状态 我做错了什么 非常感谢 这是因为setState是异步的,并且在调用后不会立即设置该值。您应该使用它的回调进行后续操作 setState(updater, [call

我正在比较
componentdiddupdate
中的道具,并尝试更新状态,然后获取一些数据(这取决于一些状态参数)

但是,正如问题所示,当我要获取数据时,函数使用的是前一个状态

沙箱:

要评估错误,请执行以下操作:使用导航栏搜索其中一个实体。检查控制台以查看状态。在导航栏中对同一实体进行另一次搜索。再次检查控制台,查看未更改的状态

我做错了什么


非常感谢

这是因为
setState
是异步的,并且在调用后不会立即设置该值。您应该使用它的回调进行后续操作

setState(updater, [callback]);
当您要在更新状态值之后立即使用它们时,这非常有用。因此,你应该:

componentDidUpdate(prevProps) {
    if (prevProps.location.search.split("?description=")[1] !==
        this.props.location.search.split("?description=")[1]) {
        this.setState({
            searchParams: this.getInitialSearchParams(),
            isLoaded: false,
            entities: []
        }, this.fetchMore); //or () => this.fetchMore() if you want to send params
    }
    
}
您可以在此处阅读有关
setState
的更多信息:

了解setState和React的生命周期也是非常有用的

希望这是有帮助的

componentDidUpdate(prevProps) {
    if (prevProps.location.search.split("?description=")[1] !==
        this.props.location.search.split("?description=")[1]) {
        this.setState({
            searchParams: this.getInitialSearchParams(),
            isLoaded: false,
            entities: []
        }, this.fetchMore); //or () => this.fetchMore() if you want to send params
    }
    
}