React 自定义 Hooks(钩子)

Hooks 钩子是可重用的函数。

当您有需要由多个组件使用的组件逻辑时,我们可以将该逻辑提取到一个自定义钩子中。

自定义钩子以 "use" 开头。比如:useFetch


构建一个钩子

在下面的代码中,我们在我们的 首页 组件中获取数据并显示它。

我们将使用 JSONPlaceholder 服务获取虚拟数据。这个服务非常适合在没有现有数据的情况下测试应用程序。

要了解更多信息,请查看 JavaScript 获取 API 部分。使用 JSONPlaceholder 服务获取虚拟 “todo” 项并在页面上显示标题:

实例:

index.js:

  1. import { useState, useEffect } from "react";
  2. import ReactDOM from "react-dom";
  3. const Home = () => {
  4. const [data, setData] = useState(null);
  5. useEffect(() => {
  6. fetch("https://jsonplaceholder.typicode.com/todos")
  7. .then((res) => res.json())
  8. .then((data) => setData(data));
  9. }, []);
  10. return (
  11. <>
  12. {data &&
  13. data.map((item) => {
  14. return <p key={item.id}>{item.title}</p>;
  15. })}
  16. </>
  17. );
  18. };
  19. ReactDOM.render(<Home />, document.getElementById("root"));

其他组件中也可能需要 fetch 逻辑,因此我们将把它提取到一个自定义钩子中。

将提取逻辑移动到一个新文件作为自定义钩子:

实例:

useFetch.js:

  1. import { useState, useEffect } from "react";
  2. const useFetch = (url) => {
  3. const [data, setData] = useState(null);
  4. useEffect(() => {
  5. fetch(url)
  6. .then((res) => res.json())
  7. .then((data) => setData(data));
  8. }, [url]);
  9. return [data];
  10. };
  11. export default useFetch;

index.js:

  1. import ReactDOM from "react-dom";
  2. import useFetch from "./useFetch";
  3. const Home = () => {
  4. const [data] = useFetch("https://jsonplaceholder.typicode.com/todos");
  5. return (
  6. <>
  7. {data &&
  8. data.map((item) => {
  9. return <p key={item.id}>{item.title}</p>;
  10. })}
  11. </>
  12. );
  13. };
  14. ReactDOM.render(<Home />, document.getElementById("root"));

实例解释

我们创建了一个名为 useFetch.js 的新文件,其中包含一个名为 useFetch 的函数,该函数包含获取数据所需的所有逻辑。我们删除了硬编码的 URL,并将其替换为可以传递给自定义钩子的 URL 变量。

最后,我们从我们的钩子中返回数据。

index.js 中,我们导入 useFetch 钩子,并像其他钩子一样使用它。这就是我们传递 URL 以从中获取数据的地方。

现在我们可以在任何组件中重用此自定义钩子以从任何 URL 获取数据了。

分类导航