reactjs React:JavaScript赋值不更新对象

xmq68pz9  于 2023-06-29  发布在  React
关注(0)|答案(1)|浏览(148)

代码:https://codesandbox.io/s/github/nieroda/js_err
在函数endTurn中

console.log(`GameBoard Before`)
    console.log(gameBoardCopy)

    gameBoardCopy[currentRow][4] = { numColorMatch: 2, numExactMatch: 2 }

    console.log(`GameBoard After`)
    console.log(gameBoardCopy)

请参见控制台输出

Before:
5: Array(5)
0: "BlueViolet"
1: "BlueViolet"
2: "BlueViolet"
3: "BlueViolet"
4: {numColorMatch: 0, numExactMatch: 0}

After 

5: Array(5)
0: "BlueViolet"
1: "BlueViolet"
2: "BlueViolet"
3: "BlueViolet"
4: {numColorMatch: 0, numExactMatch: 0}

我不知道为什么它不工作?

wz3gfoph

wz3gfoph1#

你的数据正在更新,但是它在代码的其他地方发生了变化,而且console.log并不是足够直接(特别是在console.log周围的代码沙箱wrapper)。因此,为了解决这个问题,请执行以下操作之一:

  • JSON.stringify在将数据传递给console.log之前先将其保存。这将把数据冻结成一个字符串。
  • Deep copy在传递给console.log之前,您的数据结构。(问题是there is no built-in deep copy for JS
  • 使用调试器并在日志之后设置断点,可以使用调试器控制台或debugger语句。(如果调试器控制台被隐藏,则通常会忽略debugger语句,因此请确保它已打开)。这将中断正常流并强制刷新日志,从而提供更准确的数据。

这回答了你的问题,但不是你的问题,那就是你正在突变你不期望的东西。这可以通过确保你首先是(deep) copying你正在变异的一切来解决,而不是使用mutation(像Immutable.js这样的库可以帮助你),或者使用像MobX这样的东西,它允许你变异事物,然后订阅这些变异事件。

相关问题