当前位置: 首页 > 面试题库 >

React.js:setState覆盖,不合并

隗驰
2023-03-14
问题内容

我对react.js还是很陌生,并且正在通过构建砌体样式布局进行试验。

我将每个元素呈现给DOM,然后需要遍历每个项目并根据前面的元素应用x和y位置。

初始模型如下所示:

[
  {
    "title": "The Forrest",
    "description": "some cool text",
    "imgSmallSrc": "/img/img4-small.jpg",
    "imgAlt": "Placeholder image",
    "tags": [
        "Design",
        "Mobile",
        "Responsive"
    ],
    "date": 1367154709885,
    "podStyle": {
      "width": 253
    }
  }
]

(我只显示了一个项目以使内容简短)。

完成循环并获取x和y数据后,我想将其应用于podStyle对象。我用以下数据调用setState:

[
  {
    "podStyle": {
      "x": 0,
      "y": 0,
      "height": 146,
      "width": 253
    }
  }
]

这似乎从模型中删除了所有当前数据,而只剩下了podStyle数据。我是否误解了此合并的工作方式?

在此先感谢您的帮助!


问题答案:

如果您的状态是一个对象:

getInitialState: function() {
  return { x: 0, y: 0 };
}

您可以用来setState在该对象上设置单个键:

this.setState({ x: 1 }); // y still == 0

React不会智能合并您的状态;例如,这不起作用:

getInitialState: function() {
  return {
    point: { x: 0, y: 0 },
    radius: 10
  };
}

this.setState({point: {x: 1}});
// state is now == {point: {x: 1}, radius: 10} (point.y is gone)

[编辑]

如@ssorallen所述,您可以使用不变性帮助器来获得想要的效果:

var newState = React.addons.update(this.state, {
  point: { x: {$set: 10} }
});
this.setState(newState);
有关示例,请参 见此JSFiddle: http
//jsfiddle.net/BinaryMuse/HW6w5/


 类似资料:
  • 所以我有以下 2 个数组,键为 2016 和 现在,在数组合并之后,我应该得到一个具有2个数据键的数组,和,但是我得到了一个具有3个键的数组。 为什么会这样?正常吗? 信息: PHP 5.6.30 (cli) (构建时间: Feb 7 2017 16:18:37) 版权所有 (c) 1997-2016 PHP 组 Zend Engine v2.6.0, 版权所有 (c) 1998-2016 Zen

  • 问题内容: 我正在使用JPA并收到以下警告。我已经对此进行了研究,并了解了为什么需要覆盖它以及Hibernate如何使用这些方法。我仍然有一个问题: 例外: 复合ID类不会覆盖equals() 题: 为什么Hibernate只关心没有复合ID的类?如果只有一个出席者,默认情况下是否会在现场进行比较,还是这里发生的事情更复杂? 问题答案: 因为当实体没有复合ID时,它们只有一个,即一种基本支持的类型

  • 我正在使用Spring Boot 2.1.6.RELEASE,我想知道应该如何使用? 配置示例: 和位于不同的模块中。 错误: 无法注册在类路径资源[com/example/autoconf/configuration/app configuration . class]中定义的bean“foo”。已在类路径资源[com/my/configuration/myautoconfiguration .

  • React没有合并我对状态对象所做的更改,而是完全覆盖它。 这可能是由上下文引起的吗?我不确定是否可以直接作为道具传递分派事件。我尝试过在另一个函数中包装,比如在“提升状态”文档中,但是没有效果。 预期产量 电流输出 React上下文保存状态 通用输入组件

  • 问题内容: 我知道python函数默认是虚拟的。假设我有这个: 我不希望他们能够这样做: 有没有办法防止用户重载roo()? 问题答案: 您可以使用元类: 每当创建子类时,就会调用该元类型的 new 。如果您在场,这将导致错误。仅当没有基类时,它才会接受roo的定义。 您可以通过使用注释来声明哪些方法是最终方法,从而使该方法更加理想。然后,您需要检查所有基准并计算所有最终方法,以查看是否有任何基准

  • 问题内容: 我们很少有扩展基本类的类。我们注意到我们使用了“退出一些睡眠”方法,并且希望在发生睡眠时进行记录。有没有一种方法可以覆盖Thread.sleep方法,在其中我可以添加一些自定义逻辑(即记录),然后仅调用实际的Thread.sleep()?这样,我就不必更改在我的基类中使用Thread.sleep的所有位置。我也愿意接受其他选择。 问题答案: 您不能重写方法,因为它是本机方法,所以无法对