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

在componentDidMount()中的setState()是否被视为反模式

谭山
2023-03-14
问题内容

我刚刚看过有关Inside的讨论。setState()``componentDidMount()

您可以看到该render()函数之后,该componentDidMount()函数将被React调用。当您进行setState()呼叫时,不仅componentDidMount()使整个组件树都被重新渲染,不仅是当前组件-
别忘了,当前组件刚刚完成了渲染。

有些人建议把setState()电话打进去componentWillMount()。在某些情况下,我想获取渲染元素的高度并将其存储为状态,而上述方法将不起作用。我还浏览了React的官方网站,它建议在内部进行Ajax调用componentDidMount(),这再次违背了上述想法。

那么,setState()放进去我是否错了componentDidMount()?如果是,我应该申请什么替代方案?


问题答案:

您可以setState()立即致电componentDidMount()。它会触发额外的渲染,但是会在浏览器更新屏幕之前发生。这样可以保证,即使render()在这种情况下将调用两次,用户也不会看到中间状态。
请谨慎使用此模式,因为它经常会导致性能问题
。在大多数情况下,您应该能够在中分配初始状态constructor()。但是,对于模态和工具提示之类的情况而言,当您需要
在渲染取决于其大小或位置的对象之前测量DOM节点 时,这是必要的

反应文档

使用DidMount可以清楚地表明,只有在初始渲染之后才会加载数据。这提醒您正确设置初始状态,因此您不会以导致错误的未定义状态结束。

TLDR: -如果在构造函数中具有所有需要的数据-在state此处分配

constructor(props) {
  super(props);
  // Don't call this.setState() here!
  this.state = { counter: 0 };
}
  • 调用异步操作,触摸DOM componentDidMount()


 类似资料:
  • 问题内容: 我知道数值在python中是不可变的。我还阅读了Python中的所有对象。我只想知道数字类型是否也是python中的对象。因为如果它们是对象,那么变量实际上是引用变量,对吗?这是否意味着如果我将数字传递给函数并在函数内部对其进行修改,则会创建带有两个引用的两个数字对象?python中有原始数据类型的概念吗? 注意:我也认为它是对象。但是在python导师中进行可视化显示会有所不同:ht

  • 问题内容: 我父母的渲染中有以下代码 以及下面我孩子图表中的代码 我以为仅在所有子项都加载后才调用父级的componentDidMount。但是在这里,父级的componentDidMount在子级的componentDidMount之前被调用。 这是工作方式吗?还是我做错了什么。 如果这是工作方式,我如何检测从父级加载所有子级组件的时间? 问题答案: 是的,孩子的称为父母之前的。 运行下面的代码

  • 问题内容: 我大致认为使用iframe是“不好的做法”。 这是真的?使用它们的优点/缺点是什么? 问题答案: 与所有技术一样,它也有起有落。如果您要使用iframe到一个经过适当开发的网站周围走走,那当然是个坏习惯。但是,有时iframe是可以接受的。 iframe的主要问题之一与书签和导航有关。如果您使用它只是将页面嵌入内容中,我认为很好。这就是iframe的用途。 但是我也看到iframe也被

  • 问题内容: 据我了解,一个由固定数量的元素组成,一个与您传递(相同类型)的参数数量一样多。但是他们是一样的吗?我可以通过一个期望的地方吗? 问题答案: 是的,如果您有一个带有varargs参数的方法,例如: 您这样称呼它: 然后编译器将其转换为: 参数的类型为,可以像其他数组变量一样使用。请注意,它 可能 仍然是: 有关更多信息,请参见varargs的文档。 但这 并不 意味着可变参数与阵列互换-

  • 问题内容: 在群集的完整Java EE应用程序中,DTO模式仍然是有效的选择吗?有问题的应用程序使用EJB Hibernate和Struts以及Spring等。在这种情况下传输域对象有什么问题吗? 编辑:只是为了澄清我的问题,随着现代资源和Java EE的改进,是否有理由不仅仅使用域对象?如果没有,那么DTO模式是否会逐渐消失并且不应该在新的应用程序中使用? 问题答案: 不被弃用。是否应使用DTO

  • 我曾看到一些人这样评论单例模式是一种反模式。我想知道为什么?