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

React中复杂状态的深度合并

蒋畅
2023-03-14
问题内容

当我声明以下初始状态时:

  getInitialState: function() {
    return {
      isValid: false,
      metaData: {
        age: 12,
        content_type: 'short_url'
      }
    };
  },

我用setState这样更新状态:

...
let newMetaData = {  age: 20 };
...
this.setState({
        isValid: true,
        metaData: newMetaData
      });
...

结果this.state.metadata对象仅定义了年龄。但据我所知,this.setState()将其参数合并到现有状态。为什么它在这里不起作用,这不是应该经常合并吗?

有没有办法在React / ES6中将新对象属性合并为状态对象属性?


问题答案:

setState执行浅合并。如果metaData是平坦的:

this.setState({
  metaData: Object.assign({}, this.state.metaData, newMetaData),
});

或者使用点差:

this.setState({
  metaData: { ...this.state.metaData, ...newMetaData },
});


 类似资料:
  • 问题内容: 鉴于我的初始还原状态为: 我需要做一个减速器来做到这一点: 我是使用Redux工作流程的新手,解决此问题的最佳方法是将roomList设置为immutable.js对象或编写一些代码以对我的状态对象进行深层克隆。 state.roomList还将从将来的功能中推送新数据。 总结/问题: 在状态深处进行此类更改时,在reducer中返回新状态对象的最佳方法是什么,还是应该更改Redux状

  • 鉴于我的初始重复状态为: 我需要做一个减速器,它可以: 我不熟悉使用Redux工作流,解决这个问题的最好方法是将roomList设置为不可变的。js对象或编写一些代码来深度克隆我的状态对象。 此外state.room列表将从未来的功能中向其推送新数据。 总结/问题:当在状态中进行如此深入的更改时,在reducer中返回新状态对象的最佳方式是什么,还是应该更改Redux状态对象的结构? 我所做的最终

  • const[number, setNum]=useState(0);当我想添加和更改它时,我收到了这个错误(setNum(number 1))。我的错误:超过了最大更新深度。当组件在组件WillUpdate或组件DiUpdate中重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量以防止无限循环。我能做些什么来解决这个问题?

  • 我已经查看了其他各种StackOverflow答案,它们都与我的讲师在幻灯片中写的不同。 深度优先搜索的时间复杂度为O(b^m),其中b是搜索树的最大分支因子,m是状态空间的最大深度。如果m比d大得多,这很糟糕,但如果搜索树“浓密”,则可能比广度优先搜索快得多。 他接着说。。 空间复杂度为O(bm),即动作序列长度的空间线性!只需要存储从根到叶节点的单个路径,以及路径上每个节点的剩余未扩展兄弟节点

  • 招呼: 我认为我没有正确更新我的复杂状态: 如何正确更新此状态?谢谢 https://codesandbox.io/s/intelligent-ellis-qi97k?file=/src/App.js