reactjs - 为了钩子的目的,被称为 HOC 等同于常规组件吗?
问题描述
所以有两种可能的方式来使用 React hooks:
- 直接地
const Signup = props => {
const [onSubmit, {data}] = useMutation (SIGNUP_GQL)
return (
...
)
}
export default Signup
- 在 HOC 中
const withMutation = gql => C => props => {
const [onSubmit, {data}] = useMutation (SIGNUP_GQL)
return <C onSubmit={onSubmit} data={data} />
}
const Signup = ({onSubmit, data}) => (
...
)
export default withMutation (SIGNUP_GQL) (Signup)
我更喜欢第二种模式。在我以这种方式构建整个应用程序之前,我想确保它没问题。特别是,这两种模式是否在本质上是等价的(不管实现如何),如果不是,实现是否完全支持在 HOC 中使用钩子。
干杯!
解决方案
HOC 的主要目的之一是能够创建可重用的逻辑,并将它们轻松地注入到任何组件中。当没有钩子时,唯一可行的方法是通过渲染道具模式。
有了钩子,你现在可以做大部分你需要用 HOC 做的事情。甚至所有流行的具有复杂逻辑的反应库都可以重构为使用钩子。例如:react-apollo
, react-router
等。
在大多数情况下,与 HOC 相比,钩子的开销应该更低,从而提高性能。参考
此外,通过将组件编写为函数,您可以帮助 minifier 更好地缩小代码,从而生成更小的包,这也是一件好事。参考
但是,这并不是说类组件不再有用。目前还有一些情况是用 hooks 做不到的,比如做componentDidCatch
,getDerivedStateFromProps
等。但在大多数情况下,钩子 + 函数组件应该足够了。
推荐阅读
- python - pandas DataFrame 中的点符号是如何实现的?
- javascript - 正则表达式在 Internet Explorer 中不起作用。货币字段在 chrome 上工作,但我无法在 IE 中输入任何数字
- c# - 如何在 C# 中使用语句引用数组
- java - 无法使用 Spring-Boot 应用程序从 GKE 连接到 Cloud SQL (MySQL)
- java - 在Android中将问题mm转换为像素
- python - 使用 for 循环构建 matplots 数据帧的多个图
- vb.net - 获取两个选定日期之间的所有日期
- html - Vuetify v-data-table 固定标题不起作用
- c# - 脚本完成后PHP进程不会退出
- authentication - 用于无浏览器客户端的 OIDC