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

与基于类的方法相比,在使用钩子设置状态后重新呈现有什么不同?

陶博耘
2023-03-14

类组件

在React类组件中,我们被告知setstate总是导致重新呈现,而不管状态是否实际更改为新值。实际上,当状态更新到以前的值时,组件将重新呈现。

文档(setState API引用):

如果您将状态挂钩更新为与当前状态相同的值,React将在不呈现子级或激发效果的情况下退出。(React使用object.is比较算法。)

密切相关的问题

  • 类组件中的this.setstate总是导致重新呈现,即使新的state值与以前的值相同,这是否正确?
  • 在带有钩子的函数组件中,setstatefromusestate仅在state值与以前的值不同时才重新呈现,这是否正确?
  • 在类组件的render方法中使用this.setstate设置state,与在函数组件的函数体中使用钩子设置state相同?
  • 下面的说法正确吗?
    • 在类组件中,如果我们在render方法中设置state,将出现无限循环。这是因为类组件不关心新的状态是否与以前的状态相同。它只是在每个this.setstate.
    • 上不断重新呈现
    • 在带有钩子的函数组件中,在函数体中设置状态(类似于类组件中的render方法在重新呈现时运行)并不成问题,因为当函数组件看到状态与以前的状态相同时,它就会退出重新呈现。

共有1个答案

夏奕
2023-03-14

类组件中的This.SetState总是导致重新呈现,即使新的状态值与前一个相同,这是否正确?

如果您在setState中设置了一个有效值而不返回null,则重新呈现将始终由类组件中的react触发,除非您的组件是PureComponent或您实现了shouldComponentUpdate

在带有钩子的函数组件中,useState中的setState只在状态值不同于以前的值时才导致重新呈现,这是否正确?

在技术上是的,在render方法中直接设置状态将导致函数触发重新呈现,如果类组件导致无限循环,如果状态值不同,函数组件就会发生这种情况。尽管如此,它仍然会导致一个问题,因为任何其他状态更新都将由于功能组件直接调用状态更新而被还原回来

在类组件中,如果我们在render方法中设置state,将会出现无限循环。这是因为类组件不关心新状态是否与以前的状态相同。它只是不断地在每个this.setstate上重新呈现。

是的,因此建议不要在呈现中直接调用setState

setCount(count => count + 1);
 类似资料:
  • 问题内容: 类组件 在React类组件中,告诉我们 始终* 会导致重新渲染,无论状态是否实际更改为新值。实际上,当状态更新为之前的 相同 值时,组件 将 重新渲染。 * Docs(setState API参考): 除非shouldComponentUpdate()返回false,否则setState()将始终导致重新渲染。 挂钩(功能组件) 但是,使用挂钩时,文档将更新状态指定为与先前状态相同的值

  • 我有一个组件,我在其中调用我的自定义钩子。 自定义钩子如下所示: 而我在其中使用的导致错误的组件是: 有什么想法吗?

  • 我正在学习React钩子,这意味着我将不得不从类转移到函数组件。以前,在类中,我可以拥有与状态无关的类变量,我可以在不重新呈现组件的情况下更新这些变量。现在我试图用钩子重新创建一个组件作为函数组件,我遇到了这样一个问题:我不能(就我所知)为该函数创建变量,因此存储数据的唯一方法是通过钩子。然而,这意味着每当该状态更新时,我的组件将重新呈现。 我已经在下面的示例中说明了这一点,我试图将类组件重新创建

  • 一个组件,它呈现已填好的表单的预览,当您单击左侧的表单时,它会在右侧显示它们。 第一个handleSwitchReview向我抛出了React钩子,所呈现的钩子比上一个呈现错误时要多 第二个不是。当我控制台日志道具,例如,我得到他们4-5次时,第一个函数的视图显示,但没有第二次,第二次只显示1次在控制台日志。 尝试移动setState并在控制台中记录父组件,但这个组件是唯一一个启动了很多次并中断的

  • 它几乎添加了一个对象,该对象包含来自主窗体的子窗体的值。 这是我用作按钮的函数的函数。 这将一个新对象添加到一个名为的状态,该状态是一个对象数组。 提前谢了。

  • 这两个是等价的吗?如果不是,哪一个是最好的,为什么?