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

this.setState不像我期望的那样合并状态

司徒墨竹
2023-03-14
问题内容

我有以下状态:

this.setState({ selected: { id: 1, name: 'Foobar' } });

然后我更新状态:

this.setState({ selected: { name: 'Barfoo' }});

由于setState是假设要合并的,所以我希望它是:

{ selected: { id: 1, name: 'Barfoo' } };

但是它吃掉了id,状态为:

{ selected: { name: 'Barfoo' } };

这是预期的行为吗?仅更新嵌套状态对象的一个​​属性的解决方案是什么?


问题答案:

我认为setState()不做递归合并。

您可以使用当前状态的值this.state.selected构造一个新状态,然后调用setState()该状态:

var newSelected = _.extend({}, this.state.selected);
newSelected.name = 'Barfoo';
this.setState({ selected: newSelected });

我在这里使用过函数_.extend()function(来自underscore.js库),selected通过创建状态的浅表副本来防止对该状态的现有部分进行修改

另一种解决方案是编写setStateRecursively()对新状态进行递归合并,然后对其进行调用replaceState()

setStateRecursively: function(stateUpdate, callback) {
  var newState = mergeStateRecursively(this.state, stateUpdate);
  this.replaceState(newState, callback);
}


 类似资料:
  • 然后更新状态: 由于应该合并,我希望它是: 但相反,它会吃掉id,状态为: 这是预期的行为吗?只更新嵌套状态对象的一个属性的解决方案是什么?

  • 我想使用查找从一个集合中获取一些数据并将其放入另一个集合中。 在localfield或foreignfield中写什么都不重要,因为它从player_game_stats中获取所有数据并将其插入player集合中的每个文档中。我想检查localfield和foreignField是否相等,但lookup不检查这一点。我对mongodb使用NoSqlBooster

  • 我想让某个Kafka主题只保留一天的数据。但如果我们继续向主题(活动)发送数据,它似乎根本没有删除任何数据。我尝试了主题端参数(Retention.ms)和服务器端: 但如果我们继续向它发送数据,它似乎对活的主题不起作用。只有当我们停止向主题发送数据时,它才会遵循保留策略。 那么,一个活动主题的正确配置是什么,只保留数据一段时间?

  • 你好,亲爱的StackOverflow社区,我最近遇到了一个问题,我不能把一个已经保存的对象的引用放进去。我不想保存或更新对象,因为这些对象是预先插入到我们的数据库中的。 所以基本上我的情况是这样的:我有一个父,在本例中它是一个摄取,对象有一个IntakeTimes列表,它们被声明为remainingdoses。有道理,嗯。 我的模型看起来如下: 我期待着任何帮助或提示,谢谢社区。

  • 我不明白为什么我的结果不同: 我有表订单和列价格(在mysql中键入double)。 数据库中的价格值为13.5。 查询: 结果是:1.21 查询: 结果是1.22 不舍入:结果为1.215 因此,一轮后的正确结果是1.22。 为什么查询