可以在react setState中直接更改prevState吗?

时间:2019-05-10 13:10:03

标签: reactjs

我在回答this问题,但遇到answer时不确定是否正确。

直接更改prevState可以吗?

例如

this.setState(prevState => {        
    for(let k in prevState.content.text){
        prevState.content.text[k].line = "changed";
    } 
    return {content: prevState.content}
}

这可以接受吗?如何以正确的方式做到这一点?

this.setState(prevState => {   
    let changedState = {...prevState}     
    for(let k in changedState.content.text){
        changedState.content.text[k].line = "changed";
    } 
    return {content: changedState.content}
}

我应该这样做吗?还是有更好的方法呢?

2 个答案:

答案 0 :(得分:2)

第二种方法也不正确。因为传播属性(例如{...prevState})不是深层副本。如果比较prevState.content === changedState.content,将得到true。这就是第一和第二种方法错误的原因。您可以像这样更新状态:

this.setState(prevState => {
    const newText = {};

    Object.keys(prevState.content.text).forEach((key) => {
       newText[key] = {
           ...prevState.content.text[key],
           line: "changed"
       }
    });

    return {
        content: {
            ...prevState.content,
            text: newText
        }
    }
});

或者您可以使用reduce代替forEach

答案 1 :(得分:0)

您可以修改prevState,但是您将无法跟踪componentDidUpdate钩子中的更改,因为在第二个参数中您将获得与当前参数相同的对象状态,而不是以前的状态。

第二种方法是正确的