将setState作为回调传递给另一个setState

时间:2019-12-02 06:39:48

标签: reactjs setstate

将setState用作另一个中的回调是正确的方法吗?这是我的一部分代码。

这是我的初始状态:

state = {
    resumeCollection: [],
    filters: {
        educationLevels: [],
        educationFields: [],
        jobAdvertisementId: []
    }
};

这是componentDidMount部分:

componentDidMount() {



    this.setState(prevState =>( {filters : {
        jobAdvertisementId :    [...prevState.filters.jobAdvertisementId, {value: this.props.router.query.value, id: this.props.router.query.id}]}

    } 
    )
    , () => this.setState(state => { 

        return({

            resumeCollection : state.resumeCollection.filter(resume => resume.jobAdvertisementId == state.filters.jobAdvertisementId[0].id )
        });
         }
    )

    )
}

2 个答案:

答案 0 :(得分:1)

我建议不要进行2种状态更新,因为这样会引入无用的第二次渲染。

如果您需要根据状态的另一部分来设置状态的一部分,则可以对其进行计算并将其存储在return语句之外的变量内,并在需要的地方使用它。

在您的情况下,可能看起来像这样:

componentDidMount() {
  this.setState(prevState => {
    const nextJobAdvertisementId = [
      ...prevState.filters.jobAdvertisementId,
      {
        value: this.props.router.query.value,
        id: this.props.router.query.id
      }
    ];
    return {
      filters: {
        jobAdvertisementId: nextJobAdvertisementId
      },
      resumeCollection: prevState.resumeCollection.filter(
        resume => resume.jobAdvertisementId === nextJobAdvertisementId[0].id
      )
    };
  });
}

答案 1 :(得分:0)

是的,当您要基于第一个setState()设置另一个状态时,可以将另一个setState作为回调的一部分添加到第一个setState()中。

在下面的示例中,我基于状态'a'设置'b'状态:

例如

const setB = () => {
  if(this.state.a)
    this.setState({b:"Success"})
  else
    this.setState({b:"failure"})
}

this.setState({a:true},this.setB)