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

使用钩子对函数组件和类组件进行反应

茹展鹏
2023-03-14
问题内容

随着React 中钩子的引入,现在的主要困惑是何时将函数组件与钩子和类组件一起使用,因为在钩子的帮助下statelifecycle hooks甚至可以在函数组件中获得和部分使用。所以,我有以下问题

  • 钩子的真正优点是什么?
  • 何时使用带有钩子的函数组件和类组件?

例如,带有钩子的功能组件不能像类组件那样帮助性能。他们没有shouldComponentUpdate执行就不能跳过重新渲染。还有其他原因吗?

提前致谢。


问题答案:

引入Hooks和其他特性(例如React.memoReact.lazy)的思想是帮助减少必须编写的代码,并将类似的动作聚合在一起。

文档中提到使用挂钩代替类的真正好理由

很难在组件之间重用状态逻辑
通常,当您使用HOC或renderProps时,当您尝试在DevTools中查看应用程序时,必须使用多个层次结构重新构建应用程序,Hooks避免了这种情况,并有助于更清晰的代码

复杂的组件变得很难理解,
常常使用类。互不相关的代码通常最终会在一起,或者相关的代码倾向于分离开来,因此变得越来越难以维护。这种情况的一个示例是事件侦听器,您可以在其中添加侦听器,componentDidMount然后在中将其删除componentWillUnmount。挂钩让您结合使用这两个

会使 人和机器混淆。 对于类,您需要了解绑定和调用函数的上下文,这常常会造成混乱。

带钩子的功能组件不能像类组件那样帮助性能。他们无法跳过重新渲染,因为他们没有实现shouldComponentUpdate。

可以React.PureComponent通过使用与类类似的方式来记住函数组件,React.memo并且可以将比较器函数作为第二个参数传递给React.memo它,以使您可以实现自定义比较器

这个想法是要能够编写代码,您可以使用React类组件和函数组件在Hooks其他工具的帮助下使用React类组件编写代码。挂钩可以覆盖类的所有用例,同时在提取,测试和重用代码方面提供更大的灵活性。

由于挂钩尚未完全交付,因此建议不要将挂钩用于关键组件,而应从相对较小的组件开始,是的,您可以将类完全替换为功能组件

但是,在Suspense用于数据提取之前,您仍然应该使用带钩子的功能组件来代替Class组件。使用useEffect挂钩获取数据并不像使用生命周期方法那样直观。

在@DanAbramov的一条推文中,他还提到钩子旨在与Suspense配合使用,直到可以更好地使用suspense为止。



 类似资料:
  • 我无法理解为什么我的AppReact组件呈现两次,如下面的gif所示。 我插入了一个控制台。在返回组件之前记录日志,查看组件渲染的次数。 每当我移除useState钩子时,我的应用程序只会呈现一次我认为应该呈现的效果。任何关于为什么会发生这种情况的指导都是受欢迎的

  • 我试图理解新的React钩子及其用例。 我的目标是一个单一的组成部分,计算起来,也每x滴答计数另一个计数器。 我使用useEffect和useState实现了它,主要有两个问题: 1。组件在调用超时之前卸载时发生内存泄漏(使用react router导航时) 2。该组件在每个刻度上渲染两次,因为useEffect和useState都会触发渲染。 我认为解决方案是使用useRef或usemo,但我还

  • 我正在构建一个应用程序(使用TypeScript),我面临一个问题,该解决方案需要识别不同的子组件的可能性。基本上是这样的: 我已经搜索了一段时间,许多,如果不是所有接受的答案(像这里:只允许反应组件中特定类型的子级),都是使用()。不幸的是,也有人说在生产中可能会缩小,所以我不能依赖它。 我发现的唯一方法是“强制”一个自己的显示名称。基本上,我创建了一个接口,然后为每个应该可以识别的组件扩展它。

  • 我正在测试新的React钩子,我遇到了一个我无法修复(也无法理解)的行为。基本上,我有我的函数组件,在它里面有一个函数,我在其中设置钩子。这个函数被传递给一个呈现的组件,并使用props从最后一个呈现的组件调用它。太糟糕了,父级的钩子没有相应地更新! 我知道这似乎很难理解,但我在这里复制了这个错误https://codesandbox.io/s/vvwp33l7o5 我不知道,似乎我不能从组件外部

  • 我有一个类扩展了React。组件类,我将为我希望接收的道具传递我自己的接口。问题是当我使用webstorm linter说有问题,指出类型“typeof SomeComponent”上不存在属性“propTypes”。 我不知道为什么会这样...... 的代码为 当我编写以下代码创建函数组件时,会引发类似的异常: 在本例中,使用

  • 我还是ReactJs的初学者。实际上我想重写我的类组件来钩住组件,但是我的代码有一部分有问题。有人能帮我把这个组件重写成钩子吗? 这是我的代码: