React 状态在其分配的变量更改时更改

Posted

技术标签:

【中文标题】React 状态在其分配的变量更改时更改【英文标题】:React state changes when its assigned variable changes 【发布时间】:2020-06-21 03:14:00 【问题描述】:

我遇到了一个奇怪的 React 问题。

this.state=
      testState:  testValue: "Test State" 

   
testFn = () => 
        let a;
        a = this.state.testState
        a.testValue = "Debugging is awesome";
        console.log(this.state.testState)
    

如果我对分配的变量a 进行了任何更改,那么它也会反映在状态中。

我在控制台中得到的是,

testValue: "Debugging is awesome".

任何帮助将不胜感激

编辑: 我不想改变状态。我必须修改 a 而不改变状态。我怎样才能做到这一点?

【问题讨论】:

testState 是一个对象,您正在修改它。您希望实现什么目标? 【参考方案1】:

状态更改是因为您的变量 a 包含对 testState 的引用。这是一个无操作。千万不要直接改,只能使用 react 提供的setState 函数。

this.setState( testState:  testValue: "Debugging is awesome"  );

如果您不想更改状态,可以使用扩展运算符:

let a =  ...this.state.testState ;

【讨论】:

其实我不想改变状态。我必须修改'a'而不改变状态。我怎样才能做到这一点?【参考方案2】:

为什么会这样?

这是因为 javascript 中的 objectsarrays 是参考值。无论您在何处更新其值,它都会更新源。在这种情况下,您希望使其不可变。您可以通过分配一个新对象来做到这一点。在 ES6 中,这可以通过 spread operator 来完成。

解决方案

let a =  ...this.state.testState ;

进一步阅读

Mozilla 网络文档:Spread syntax

【讨论】:

【参考方案3】:

如果你不希望它受到影响,你必须深度复制状态(Object.assign):

this.state=
  testState:  testValue: "Test State" 


testFn = () => 
    let a;
    a = Object.assign(, this.state.testState);
    a.testValue = "Debugging is awesome";
    console.log(this.state.testState)

或者您可以使用...this.state.testState 代替Object.assign

请注意,使用扩展运算符 ... 不会保留原型属性 (instanceof)。

【讨论】:

【参考方案4】:

您可以使用扩展运算符创建对象的副本

const newObj = ...obj;

【讨论】:

【参考方案5】:

使用 JS,当你将一个对象影响到一个变量时(这里是testState),它是通过引用传递的(更多解释见here)。

这意味着如果您通过其中一个变量修改对象,则引用源的每个变量都将应用更改。

为了解决您的问题,您可以使用扩展运算符,它复制对象而不直接引用它:

let a = ...this.state.testState

【讨论】:

【参考方案6】:

尝试:

this.state=
      testState:  testValue: "Test State" 


testFn = () => 
        const a =  ...this.state.testState ;
        a.testValue = "Debugging is awesome";
        console.log(this.state.testState)
    

【讨论】:

【参考方案7】:

您必须为此使用扩展运算符 (...) 而不是直接分配。

this.state=
      testState:  testValue: "Test State" 

   
testFn = () => 
        let a;
        a = ...this.state.testState
        a.testValue = "Debugging is awesome";
        console.log(this.state.testState)
    
    
testFn()

【讨论】:

以上是关于React 状态在其分配的变量更改时更改的主要内容,如果未能解决你的问题,请参考以下文章

如果您将状态值分配给另一个变量然后更改状态,React 不会触发重新渲染

React Native刷新屏幕/组件/更改状态

这是在 React 中更改对象状态变量的最安全、最正确的方法吗?

反应:当我用后增量更改变量的状态时,程序中的值不同

在 React Form 中更新 props 更改的状态

React.js 使用非状态变量获取错误作为组件正在更改要控制的文本类型的不受控制的输入