【发布时间】:2020-05-24 18:26:49
【问题描述】:
我正试图围绕自定义挂钩。我理解普通的钩子很好,但我的问题是,在编写自定义钩子时,它和普通函数有什么区别?我的意思是为什么不称它为普通函数而不是像 use* 之类的调用它
【问题讨论】:
标签: reactjs react-hooks
我正试图围绕自定义挂钩。我理解普通的钩子很好,但我的问题是,在编写自定义钩子时,它和普通函数有什么区别?我的意思是为什么不称它为普通函数而不是像 use* 之类的调用它
【问题讨论】:
标签: reactjs react-hooks
一个自定义钩子依赖于另外一个钩子。按照设计,React 钩子旨在从组件的渲染方法中使用。如果您尝试在其他任何地方使用钩子,您将收到警告。自定义挂钩遵循与内置挂钩相同的约定,因为它们必须以相同的方式使用。 use 前缀只是一个约定,用于标识通常在组件渲染方法的最顶部调用的钩子函数。
你可以为你的钩子函数命名任何你想要的名字,但正如我所提到的,如果在渲染方法之外使用,你会收到来自 React 的警告。
【讨论】:
documentation and rules 之外,仅将其称为普通旧函数(除了 linting 功能)有什么优势?
myCustomFunction 而不是命名为 useCustomFunction,所以除了 linting 和其他记录在案的规则之外,我不会失去任何功能吗?
来自 React docs:
自定义 Hook 是一个 JavaScript 函数,其名称以“use”开头,并且可以调用其他 Hook。 [...] 它的名称应始终以“use”开头,以便您一眼就能看出rules of Hooks 适用于它。
那么为什么要使用特殊的“使用”命名前缀来定义自定义 Hook?
1.) 它告诉消费者,这些函数旨在与 React 一起使用并遵守隐式合同(上述规则)。
2.) 您可以获得检查和执行这些规则的工具支持。例如,eslint-plugin-react-hooks 使用 heuristic 假设函数以“use”前缀开头,后面是大写字母是 Hook。
【讨论】:
React Hooks(自定义或非自定义)应该以 use 前缀开头。以及,根据 React 文档:
1) Hooks 只能从 React 代码调用,而不是从常规 JS 函数调用。因此,Hooks 的范围仅限于 React 代码世界,并且有更多的能力来处理 React 代码。与 JS 不同,常规函数可以跨应用程序使用,但由于 React 代码指南使代码更符合 React 语法。
2) 在基于类的组件中,Hooks 不起作用,但常规函数可以。
3) 在常规 JS 函数中,您无法访问 useState、useEffect、useContext 等,但在 react 自定义挂钩中我可以。
【讨论】:
我相信没有人准确地回答您的问题。我仍然理解拥有这个称为钩子的额外功能的好处和目的,但我仍然可以分享我的理解。
React Hooks 是具有 react 能力的 JS 函数,这意味着你可以添加一些逻辑,你也可以添加到普通的 JS 函数中,但你也可以使用原生的钩子,如 useState、useEffect 等,以启动该逻辑,为其添加状态,或为其添加副作用,记忆或更多。 所以我相信 hooks 是一个非常好的以隔离方式管理组件逻辑的东西。
因此,您可以有一个 foo.component.js (UI)、一个 useFoo.js(logic),其中 useFoo 可能包含许多 js 函数和一个用于管理这些函数并返回其应有内容的钩子。
这是一个关于 React hooks 的精彩视频,强烈推荐
【讨论】:
useState 或其他 React 钩子,并且你可以在 React 组件之外调用它,那么一个简单的函数是合适的?
有一些差异和问题让我们使用 react 自定义钩子:
useCallBack 来修复它,并且每次重新渲染时都不要创建新函数,但这不是我们要解决的主要问题。useCallBack来避免每次都创建新函数,我们并没有解决问题,因为在每个组件中我们也应该复制这个逻辑,所以这没有解决问题。
那么这里的解决方案是什么?是的,自定义 React Hooks!
useState、useCallback 等),可以将您想要在一个地方收集的有状态逻辑包裹起来并避免在多个组件中复制和粘贴相同的逻辑。我希望这个答案可以解决你的问题,解决你的歧义。
【讨论】:
useCallback 的东西),看起来你混淆了回调函数(在渲染阶段创建)和常规函数与自定义钩子(两者都在外部创建反应生命周期)。那么最后的解决方案真的不符合你答案的前提!?