React 自定义钩子和常规函数的区别

IT技术 reactjs
2021-05-04 18:09:20

常规 JS 函数、帮助器/服务函数和 React Custom Hook 之间有什么区别?

我发现的类似答案没有给出任何好的例子,所以我创建了这个“服务”函数,我将使用它来列出其他函数组件中的一些用户:

import axios from "axios";

const useService = () => {
  const fields = [
    { key: "name", _style: { width: "40%" } },
    { key: "email", _style: { width: "40%" } },
  ];

  const getUsers = async () => {
    return await axios.get("http://127.0.0.1:8000/api/users");
  };

  const getBadge = (status) => {
    switch (status) {
      case "Active":
        return "success";
      case "Inactive":
        return "secondary";
      case "Pending":
        return "warning";
      case "Banned":
        return "danger";
      default:
        return "primary";
    }
  };

  return { fields, getUsers, getBadge };
};

export default useService;

我调用了它,useService但我实际上并没有在这里使用任何 React 钩子,例如 useEffectuseState等等。那么这个函数仍然是一个自定义钩子吗?它只是一个实用程序/辅助功能吗?

当我们谈论自定义钩子和实用程序/助手/服务/正常功能等时,究竟有什么区别......

3个回答

那么这个函数还是自定义 Hook 吗?它只是一个实用程序/辅助功能吗?

不,这不是钩子。

钩子在函数组件的调用周围使用有状态的闭包来代表该组件实例存储状态。该闭包由 React 维护。

我需要阅读深入了解:React hooks 是如何真正工作的,然后我才能将头环绕在 hooks 上。

最近我也遇到了:

那么这个函数还是自定义 Hook 吗?它只是一个实用程序/辅助功能吗?

它以 开头use,因此如果在 React 组件中使用它,React 会将其识别为有效的自定义钩子 - 即可以在其中使用钩子。即使它里面没有使用任何钩子,它仍然有资格作为一个 - 但是如果你不使用任何钩子,它本身是否有资格作为一个钩子并不重要,因为区别永远不会检查或有任何影响。

为避免混淆,我建议仅use在函数实现钩子并且是自定义钩子的情况下才添加函数名称。

正如文档所说

自定义 Hook 是一个 JavaScript 函数,其名称以“use”开头,并且可以调用其他 Hook。

你不必打电话给你的自定义的钩子里等挂钩-但如果你的目标做一个自定义的钩子摆在首位,你可能要被调用其它钩子一样useState否则,调用您的自定义效用函数别的,不会有启动use可能会更有意义-尽管事实上,无论你做或不做并不直接影响代码运行。

实际上,自定义钩子只是一个函数。它应该在函数名称前加上use. 在大多数情况下,react 提供的钩子被组合成功能单元,但这不是强制性的。您可以在此处查看一些实用的自定义挂钩以供参考。

https://usehooks.com/