什么时候以及如何在React Hooks和旧的HOC道具之间进行选择?

S.K*_*aus 10 reactjs react-hooks

直到现在,我们还习惯于Flux流,其中数据通过prop进入组件。因此,您可以查看Props签名并查看组件要求是什么。

挂钩是一个了不起的功能,但是当我们过渡到它们时,我发现它们为依赖关系提供了另一个入口,这很难管理,因为您必须查看实际的组件代码才能看到它。

当然,我们只能在容器组件中使用Hook,但是我认为它们的一些主要卖点是它们减少嵌套和HOC的能力。

(目前)确定哪个组件应该使用挂钩以及哪个组件应该使用渲染道具的最佳实践是什么?

Eda*_*rit 6

Hooks 和 HOCs 是不同的编程模型,比较它们就像比较橙子和苹果一样。

TL; 博士

根据经验,当我想要组件的条件渲染(如果条件:渲染 A,否则渲染 B)时,我使用 HOC,否则,我使用钩子。这只是我的意见。

优点缺点:

HOC 优点

  • 轻松地将所有逻辑与 UI 组件分离(请参阅recompose)。
  • 易于作曲。
  • 任何渲染之前操作组件。

HOC 的缺点

  • 名称冲突 - 2 个 HOC 可以使用和设置同名的道具。
  • React dom 是巨大的。
  • 父属性的每一个变化都会导致子属性重新渲染——这是 React 中的默认行为,但是当我们有很多 HOC 时,我们需要非常小心。
  • 类型 - 从组件的角度来看,很难理解我们得到了哪些道具和类型。
  • 使用 HOC 会将所有 props 传递给 child,即使 child 只需要来自该特定 HOC 的 prop x
  • 使用依赖于 HOC 的组件道具的参数的过程可能很复杂

HOC 正反两方面

  • 无需定义变量,只需用 HOC 包裹,您将获得 HOC 提供的道具 - 这使我们的 UI 组件“猜测”道具的名称。

钩子的优点

  • 可读性和声明性。
  • 性能 - 仅在更改特定道具时更新。
  • 成长中的社区。

钩子的缺点

  • 仅在组件内 - 这意味着不能通过传递的道具条件渲染组件。
  • 包含 UI 和逻辑的巨型组件文件。


Shu*_*tri 5

并根据该阵营常见问题钩可被用作替代renderPropsHOCs,但可以与他们共存

通常,渲染道具和高阶组件仅渲染一个孩子。我们认为,挂钩是服务此用例的更简单方法。这两种模式仍然存在(例如,虚拟滚动器组件可能具有renderItem属性,或者可视容器组件可能具有其自己的DOM结构)。但是在大多数情况下,挂钩就足够了,并且可以帮助减少树中的嵌套。

挂钩允许功能组件中的状态逻辑,并且类似于React中的类组件。

挂钩很难管理,因为您必须查看实际的组件代码才能看到它。

并非如此,因为您可以在自定义钩子中提取HOC或renderProps中的自定义逻辑,并查找其实现,而不是了解实际组件中实际发生的情况。