当前位置: 首页 > 知识库问答 >
问题:

这.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' } }; 

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

共有1个答案

山鸿彩
2023-03-14

我认为setstate()不执行递归合并。

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

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

我在这里使用了函数_.extend()函数(来自Underscore.js库),通过创建状态中现有的selected部分的浅拷贝来防止对其进行修改。

setStateRecursively: function(stateUpdate, callback) {
  var newState = mergeStateRecursively(this.state, stateUpdate);
  this.replaceState(newState, callback);
}
 类似资料:
  • 问题内容: 我有以下状态: 然后我更新状态: 由于setState是假设要合并的,所以我希望它是: 但是它吃掉了id,状态为: 这是预期的行为吗?仅更新嵌套状态对象的一个​​属性的解决方案是什么? 问题答案: 我认为不做递归合并。 您可以使用当前状态的值构造一个新状态,然后调用该状态: 我在这里使用过函数function(来自underscore.js库),通过创建状态的浅表副本来防止对该状态的现

  • 我正在使用wedriveri o 4.5: 我需要等到某个元素存在,如果它不存在,处理这种情况。 例如: 但如果页面上不存在元素,webdriver会将我的测试标记为失败,并显示消息:“超时10000毫秒。”。尝试减少运行时间或增加测试规格的超时时间(http://webdriver.io/guide/testrunner/timeouts.html); 如果回复promise,确保其得到解决 >

  • 下面是一个类和log4j配置: $vi My.java $vi log4j2.xml 在日志/foo.bar.log中出现和消息。这是我所期望的。但是在日志/foo.log中什么都没有出现,我期望那里有消息。在控制台上也什么都没有出现,但是我期望消息。所以它没有像我预期的那样工作。那么我的错误是什么? 还有LogManager的论点。getLogger必须是记录器的名称。但我也看到了论点是类的例子

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

  • 我试图执行一个简单的浏览器测试 浏览器立即启动并关闭,引发以下错误 HTTP请求路径为空意味着什么?新版本的watir是否更改了调用参数? 有人遇到过类似的问题吗? 我的系统是Windows 7 64位,我运行在一个代理之后,浏览器已经配置了一个代理 ---编辑--- 我引入了一个尾随斜杠,但我现在得到了一个新的错误,也得到了以前的错误,每次我都要更改代码并保存它来获得这个错误 ---编辑---