javascript - 为什么 React 中的 SetState 会更新处理程序中的其他对象?

标签 javascript reactjs setstate

在 onChange 事件处理程序中,我仅对 userTxt 进行 setState() 调用,但看起来它还设置了颜色对象的状态。对我来说奇怪的是,这只发生在颜色对象上,而没有发生在年龄变量上。

想知道是否有人可以解释为什么会发生这种情况? Here is a link to my webpackbin example. As you write in the input, the state is changed on the color object.

我希望有人可以向我解释为什么会发生这种情况。预先非常感谢您。

import React, { Component } from 'react';

export default class Hello extends Component {

  constructor() {
    super();
    this.handleMe = this.handleMe.bind(this);
    this.state = {
        age: 21,
        colors: {
            best: 'blue',
            second: 'green'
        },
        userTxt: ""
    }
  }
  handleMe(e) {
        let myAge = this.state.age;
        let myColors = this.state.colors;

        myAge = myAge + 1;
        myColors['best'] = 'mistyrose';
        myColors['second'] = 'red';

        this.setState({ userTxt: e.target.value });
    }

  render() {
    const { age, colors, userTxt} = this.state;
    return (
      <div>
        <form action="">
          <input type="text"onChange={this.handleMe}/>
          <div>Age: {age}</div>
          <div>Colors - best: {colors.best}</div>
          <div>Colors - second: {colors.second}</div>
          <div>UserTxt: {userTxt}</div>
        </form>
      </div>
    )
  }
}[enter link description here][1]


  [1]: https://www.webpackbin.com/bins/-KvFx-s7PpQMxLH0kg7m

最佳答案

状态中的颜色字段是一个存储为引用的对象。年龄字段是一个整数,并存储为原始值。

当您将颜色字段分配给 myColors 时,两个变量都引用同一对象。因此,当您更新 myColors 时,状态中的颜色字段也会更新。

当您将年龄字段分配给 myAge 时,它​​会将 state 中年龄字段的值复制到 myAge 字段。因此,当您更新 myAge 时,它​​不会更新状态。

有关此内容的更多信息,请访问 Primitive value vs Reference value

为了防止这种意外的副作用,您应该创建一个新对象并将颜色值从状态复制到它。您可以通过使用来做到这一点

let myColors = {...this.state.colors};

声明变量时。

关于javascript - 为什么 React 中的 SetState 会更新处理程序中的其他对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46499639/

相关文章:

javascript - 如何将 IEnumerable<HtmlElement> 转换为常规 HtmlElement

reactjs - 将类型不兼容的函数分配给 ref 属性

javascript - 如何使我的输入字段预先填充数据并在页面加载时可编辑?

javascript - 如何在映射循环中从 onClick 向函数发送唯一值

javascript - 不同 '&lt;script&gt;' 标签中的相同变量不会发生冲突吗?

javascript - 在文本区域和 Javascript 代码中显示特殊字符

reactjs - 访问 XMLHttpRequest 被 CORS 阻止,请求的资源上不存在 'Access-Control-Allow-Origin' header ,仅用于 PUT 和 DELETE API

javascript - 如何在 React Hooks 中单击按钮时调用函数来监听另一次鼠标单击?

Flutter - Dart - setState 在与异步函数的 Future<> 一起使用时不会重新加载状态

javascript - 如何阅读和理解Event-Parameters的控制台日志