javascript - 在调用 setState 之前 react : why state change when try to change it in immutable way ,

标签 javascript reactjs ecmascript-6

当我尝试在 React 中更改状态不可变方式时,它在我调用 setstate 之前更改状态,这让我困惑了 3 天。

这是我在 onClick 事件中调用的方法:

share = (indexFolder) => {
    console.log(this.state.folderInfo);
    const updateFolderInfo = [...this.state.folderInfo];
    updateFolderInfo[indexFolder].isProcessing = false; 

    //state**is already changed**strong text** when console **
    console.log(this.state.folderInfo);

    this.setState({
            folderInfo : updateFolderInfo,
    })
    // the setState call do not take effect here 
}

这是执行方法的地方:

<Folder key={folder._id}
        sharing={this.state.folderIsProcessing}
        folder={folder} 
        delete={() => this.delete(index)}
        share={() => this.share(index)} />
//I'm passing share function as props in here ^ , and use it on 
//click event in the Folder component . 

有什么建议为什么会这样吗?

最佳答案

这里的问题是通过做 const updateFolderInfo = [...this.state.folderInfo];您实际上是在制作 folderInfo副本.

这意味着,如果您修改 updateFolderInfo 中的任何项目这是一个对象或数组,您还将在原始 folderInfo 中修改相同的对象/数组。数组。

假设folderInfo里面只有 JSON,这是一个使用 JSON.stringify 的潜在解决方案和 JSON.parse创建深拷贝:

share = indexFolder => {
  const updatedFolderInfo = JSON.parse(JSON.stringify(this.state.folderInfo));
  updatedFolderInfo[indexFolder].isProcessing = false; 

  this.setState({ folderInfo : updatedFolderInfo });
}

这里有一个小例子,以简化的方式向您展示您当前正在做什么:

array1 = [{id: 1}, {id: 2}, {id: 3}]
array2 = [...array1]

array2[0].id = 100

array2
// [{id: 100}, {id: 2}, {id: 3}]

array1
// [{id: 100}, {id: 2}, {id: 3}]

您可以找到有关浅克隆与深度克隆的更多信息 here .

关于javascript - 在调用 setState 之前 react : why state change when try to change it in immutable way ,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51419488/

相关文章:

Javascript 标记化列表到关联集合

reactjs - react native 和 typescript 多内联样式

javascript - Flow 不理解 proptypes

javascript - 为什么使用 ES6 Map 而不是普通的 javascript 对象?

javascript - 在nodejs中迭代项目数组

javascript - 使用 $interval/$timeout 从 API 中提取数据是坏还是好做法?

javascript - 保持背景 div 固定,同时允许另一个 div 作为覆盖层在其上滚动

显示和隐藏 div 的 javascript 函数

javascript - 无需重新渲染即可进行路由的 react 方式

javascript - 显示和映射多个键及其对象数据