随着React中hooks的引入,现在主要的困惑是何时使用带有钩子和类组件的函数组件,因为在钩子的帮助下,即使在函数组件中也可以得到state和部分lifecycle hooks.所以,我有以下问题

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

例如,带有钩子的函数组件不能像类组件那样帮助实现性能.他们不能跳过重新渲染,因为他们没有实现shouldComponentUpdate个.还有其他原因吗?

提前谢谢.

推荐答案

引入Hooks以及React.memoReact.lazy等其他功能的 idea 是帮助减少必须编写的代码,并将类似的操作聚合在一起.

文档中提到了使用钩子而不是类的几个真正好的理由

It’s hard to reuse stateful logic between components通常,当你使用HOC或renderProps时,当你试图在DevTools中看到它时,你必须用多个层次 struct 来重新构造你的应用,钩子可以避免这种情况,并帮助你编写更清晰的代码

Complex components become hard to understand通常与类相互不相关的代码通常会一起结束,或者相关的代码往往会被拆分,维护变得越来越困难.这种情况的一个例子是事件侦听器,在componentDidMount中添加侦听器,在componentWillUnmount中删除它们.钩子可以让你把这两者结合起来

Classes confuse both people and machines对于类,您需要了解绑定和调用函数的上下文,这通常会造成混淆.

带有钩子的函数组件在perf as类中没有帮助

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


我们的 idea 是,在Hooks和其他实用程序的帮助下,能够使用React class component和function component编写代码.钩子可以覆盖类的所有用例,同时在提取、测试和重用代码方面提供更大的灵活性.

由于钩子还没有完全发布,建议不要对关键组件使用钩子,从相对较小的组件开始,是的,您可以用功能组件完全替换类


然而,有一个原因是,在数据获取悬念结束之前,仍然应该使用类组件,而不是带有挂钩的函数组件.使用useEffect挂钩获取数据不像使用生命周期方法那样直观.

另外@DanAbramov在他的一条推文中提到,钩子设计用于悬念,在悬念消失之前,最好使用类

Reactjs相关问答推荐

下拉Tailwind CSS菜单与怪异beviour

如何处理具有REACTION-REDUX状态的Nextjs路由警卫

可以使用mode.css/mode.scss引用常规的类名吗?

在新屏幕上显示照片时出现问题-react

在Reaction中的第一次装载时,Use Effect返回空数组

生产部署:控制台中 Firebase 无效 api 密钥错误

更新对象状态的父数组时记住子组件

如何管理组件列表的复杂状态? (Nextjs/ReactJS)

在一个事件处理程序中进行多次调度是个好主意吗?

是否可以直接在 jsx 标签上使用 CSS 定义的 colored颜色 ?

React对象值下降2次而不是1次

如何使用 redux 和 react-plotly.js

React + Redux:数据未正确传递给具有动态路由的组件

带有 webpack 错误多个文件匹配路由名称的 Expo-router.无法Bundle 或部署应用程序

DatePicker MUI 如何在日历左侧显示清除文本

如何通过单击多个选项中的特定项目在模态上呈现不同的标题?

未捕获的错误:操作必须是使用 redux/toolkit 的普通对象

如果查询不存在,如何返回所有产品?

无法重用我的组件,它只显示 1 次

将 C# Razor 条件块转换为 React.js 代码