”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 理解和创建 React 中的自定义 Hook

理解和创建 React 中的自定义 Hook

发布于2024-09-14
浏览:310

Understanding and Creating Custom Hooks in React

目录

  1. 先决条件
  2. 安装
  3. 介绍
  4. 什么是自定义 Hook?
  5. 什么时候应该创建自定义 Hook?
  6. 示例:创建自定义挂钩
    • 第 1 步:识别可重用逻辑
    • 第 2 步:将逻辑提取到自定义 Hook 中
    • 第 3 步:使用自定义 Hook
  7. 自定义 Hook 的好处
  8. 自定义 Hook 的最佳实践
  9. 结论

先决条件:

确保您具备以下方面必要的背景知识:

React基础知识
Node.js 和 npm

安装:

要开始使用 Vite 开始一个新的 React 项目,请按照以下步骤操作:

我。打开终端并运行以下命令来创建新项目:

   npm create vite@latest my-react-app --template react

ii.导航到您的项目目录:

     cd my-react-app


三.安装依赖项:安装项目所需的包:

   npm install

四.启动开发服务器: 运行开发服务器:

    npm run dev

您的 React 应用程序现在将运行,您可以在浏览器中查看它:http://localhost:5173。

介绍:

什么是 React Hook?:

React hooks 是特殊的函数,允许您在功能组件中使用状态和其他 React 功能。像 useState 和 useEffect 这样的钩子对于管理状态和副作用至关重要。

什么是自定义挂钩?:

自定义挂钩可以被描述为跨多个组件重用逻辑的一种方式。您可以将其封装在自定义挂钩中,而不是重复代码,从而使您的组件更清晰,代码更易于管理。就像使用自定义钩子时的 React 钩子一样,请确保您的组件名称以以下形式开头(use 后跟您想要为组件指定的名称,例如 useFetchData)。useFetchData 可以是一个自定义 Hook,它从 API 获取数据并将其返回给您的组件。成分。

了解 Hooks 吗?

了解 Hook:
useState、useEffect 和 useContext 等 Hook 允许您在不编写类的情况下使用状态和其他 React 功能。它们是让您以模块化方式处理组件逻辑的构建块。

什么时候应该创建自定义挂钩?

自定义挂钩让您可以在不同组件之间重用有状态逻辑。一个简单的例子是计数器组件,它具有递增、递减和重置功能,如果您需要在多个组件中使用相同的逻辑,则可以将逻辑移至自定义挂钩。另一个常用的示例是从 API 获取数据的组件,如果您需要在多个组件中使用相同的逻辑,则可以将该逻辑移动到自定义挂钩。

创建自定义钩子的示例

示例:让我们使用 React hook(useState) 创建一个简单的计数器应用程序。在 app.jsx 中

第 1 步确定可重用逻辑

import React, { useState } from "react";

import "./App.css";

function App() {
  // usestate hooks
  const [counterstate, setCounterstate] = useState(0);

  // function for increment,decrement and reset
  const increment = () => {
    setCounterstate((prev) => prev   1);
  };
  const decrement = () => {
    setCounterstate((prev) => prev - 1);
  };
  const reset = () => {
    setCounterstate(0);
  };
  return (
    

Counter App

{counterstate}

); } export default App;

在上面的代码中,可重用逻辑包括计数器状态、初始状态(o)、递增、递减和重置函数。增量在初始状态上加 1,减量从初始状态减 1,而复位则重置为第一个初始状态。

步骤 2 将逻辑提取到自定义钩子中

我们可以在 src 文件夹中创建一个名为 Hooks 的文件夹,然后为自定义钩子创建一个名为 useCouter.jsx 的文件,如下所示。

import React, { useState } from "react";

const useCounter = (initialvalue) => {
  const [value, setValue] = useState(initialvalue);
  const increment = () => {
    setValue((prev) => prev   1);
  };
  const decrement = () => {
    setValue((prev) => prev - 1);
  };
  const reset = () => {
    setValue(initialvalue);
  };

  return { value, increment, decrement, reset };
};

export default useCounter;

步骤 3 使用自定义钩子

现在,让我们在 App.jsx 中使用我们的自定义钩子。

import React, { useState } from "react";
import "./App.css";
import useCounter from "./Hooks/useCounter";

function App() {

  const { value, increment, decrement, reset } = useCounter(0);
    return (
    

Counter App

{value}

); } export default App;

示例 2.

让我们为所有 API 调用创建一个自定义钩子 useFetch。

import React, { useState, useEffect } from "react";

const useFetch = (url) => {
  const [data, setData] = useState(null);
  const [error, setError] = useState(null);
  const [loading, setLoading] = useState(true);
  useEffect(() => {
    const fetchData = async () => {
      try {
        const response = await fetch(url);
        const jsonData = await response.json();
        setData(jsonData);
      } catch (error) {
        setError(error);
      } finally {
        setLoading(false);
      }
    };
    fetchData();
  }, [url]);
  return { data, error, loading };
};

export default useFetch;

用法

在App.jsx中,我们可以使用这个自定义钩子从JSON占位符中获取用户名,如下所示;

import React, { useState } from "react";
import "./App.css";
import useCounter from "./Hooks/useCounter";
import useFetch from "./Hooks/useFetch";

function App() {
  const { value, increment, decrement, reset } = useCounter(0);
  const { data, error, loading } = useFetch(
    "https://jsonplaceholder.typicode.com/users"
  );

  return (
    

Counter Appp

{value}

{loading &&
Loading....
} {error &&
Error: {error.message}
} {data && data.length > 0 && (

Username: {data[0].username}

)}
); } export default App;

定制钩子的好处

可重复使用性:

主要好处之一是可重用性。您可以在多个组件中使用相同的自定义钩子,减少代码重复。

关注点分离:

自定义挂钩可帮助您将逻辑与 UI 分离。您的组件专注于渲染,而自定义挂钩处理逻辑。

清洁剂组件:

通过将复杂的逻辑转移到自定义挂钩,您的组件变得更简单、更容易理解。

自定义 Hook 的最佳实践

命名约定:

自定义挂钩应以“use”一词开头,以遵循 React 命名约定。这也有助于快速识别代码中的钩子。

示例:useFetch、useForm、useAuth。

处理依赖关系:

当在自定义钩子中使用 useEffect 等钩子时,请确保正确处理依赖关系以避免错误或不必要的重新渲染。

避免不必要的重新渲染:

通过记忆值或使用 useCallback 和 useMemo 等挂钩来优化您的自定义挂钩,以避免重新运行昂贵的计算或重新获取数据。

结论

我们探索了自定义钩子的概念及其在简化和增强 React 应用程序开发中的作用。通过创建自定义挂钩,您可以封装和重用有状态逻辑,这有助于保持组件的整洁和可维护性。

查看 GitHub 上的项目:我的 GitHub 存储库

版本声明 本文转载于:https://dev.to/adaobilynda/understanding-and-creating-custom-hooks-in-react-37pd?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 缓冲区:Node.js
    缓冲区:Node.js
    Node.js 中缓冲区的简单指南 Node.js 中的 Buffer 用于处理原始二进制数据,这在处理流、文件或网络数据时非常有用。 如何创建缓冲区 来自字符串: const buf = Buffer.from('Hello'); 分配特定大小的Buffer...
    编程 发布于2024-11-05
  • 掌握 Node.js 中的版本管理
    掌握 Node.js 中的版本管理
    作为开发者,我们经常遇到需要不同 Node.js 版本的项目。对于可能不经常参与 Node.js 项目的新手和经验丰富的开发人员来说,这种情况都是一个陷阱:确保每个项目使用正确的 Node.js 版本。 在安装依赖项并运行项目之前,验证您的 Node.js 版本是否匹配或至少兼容项目的要求至关重要。...
    编程 发布于2024-11-05
  • 如何在 Go 二进制文件中嵌入 Git 修订信息以进行故障排除?
    如何在 Go 二进制文件中嵌入 Git 修订信息以进行故障排除?
    确定 Go 二进制文件中的 Git 修订版部署代码时,将二进制文件与构建它们的 git 修订版关联起来会很有帮助排除故障的目的。然而,直接使用修订号更新源代码是不可行的,因为它会改变源代码。解决方案:利用构建标志解决此挑战的方法包括利用构建标志。通过使用构建标志在主包中设置当前 git 修订版的版本...
    编程 发布于2024-11-05
  • 常见 HTML 标签:视角
    常见 HTML 标签:视角
    HTML(超文本标记语言)构成了 Web 开发的基础,是互联网上每个网页的结构。通过了解最常见的 HTML 标签及其高级用途,到 2024 年,开发人员可以创建更高效​​、更易于访问且更具视觉吸引力的网页。在这篇文章中,我们将探讨这些 HTML 标签及其最高级的用例,以帮助您提高 Web 开发技能。...
    编程 发布于2024-11-05
  • CSS 媒体查询
    CSS 媒体查询
    确保网站在各种设备上无缝运行比以往任何时候都更加重要。随着用户通过台式机、笔记本电脑、平板电脑和智能手机访问网站,响应式设计已成为必要。响应式设计的核心在于媒体查询,这是一项强大的 CSS 功能,允许开发人员根据用户设备的特征应用不同的样式。在本文中,我们将探讨什么是媒体查询、它们如何工作以及实现它...
    编程 发布于2024-11-05
  • 了解 JavaScript 中的提升:综合指南
    了解 JavaScript 中的提升:综合指南
    JavaScript 中的提升 提升是一种行为,其中变量和函数声明在之前被移动(或“提升”)到其包含范围(全局范围或函数范围)的顶部代码被执行。这意味着您可以在代码中实际声明变量和函数之前使用它们。 变量提升 变量 用 var 声明的变量被提升到其作...
    编程 发布于2024-11-05
  • 将 Stripe 集成到单一产品 Django Python 商店中
    将 Stripe 集成到单一产品 Django Python 商店中
    In the first part of this series, we created a Django online shop with htmx. In this second part, we'll handle orders using Stripe. What We'll...
    编程 发布于2024-11-05
  • 在 Laravel 中测试排队作业的技巧
    在 Laravel 中测试排队作业的技巧
    使用 Laravel 应用程序时,经常会遇到命令需要执行昂贵任务的情况。为了避免阻塞主进程,您可能决定将任务卸载到可以由队列处理的作业。 让我们看一个例子。想象一下命令 app:import-users 需要读取一个大的 CSV 文件并为每个条目创建一个用户。该命令可能如下所示: /* Import...
    编程 发布于2024-11-05
  • 如何创建人类水平的自然语言理解 (NLU) 系统
    如何创建人类水平的自然语言理解 (NLU) 系统
    Scope: Creating an NLU system that fully understands and processes human languages in a wide range of contexts, from conversations to literature. ...
    编程 发布于2024-11-05
  • 如何使用 JSTL 迭代 HashMap 中的 ArrayList?
    如何使用 JSTL 迭代 HashMap 中的 ArrayList?
    使用 JSTL 迭代 HashMap 中的 ArrayList在 Web 开发中,JSTL(JavaServer Pages 标准标记库)提供了一组标记来简化 JSP 中的常见任务( Java 服务器页面)。其中一项任务是迭代数据结构。要迭代 HashMap 及其中包含的 ArrayList,可以使...
    编程 发布于2024-11-05
  • Encore.ts — 比 ElysiaJS 和 Hono 更快
    Encore.ts — 比 ElysiaJS 和 Hono 更快
    几个月前,我们发布了 Encore.ts — TypeScript 的开源后端框架。 由于已经有很多框架,我们想分享我们做出的一些不常见的设计决策以及它们如何带来卓越的性能数据。 性能基准 我们之前发布的基准测试显示 Encore.ts 比 Express 快 9 倍,比 Fasti...
    编程 发布于2024-11-05
  • 为什么使用 + 对字符串文字进行字符串连接失败?
    为什么使用 + 对字符串文字进行字符串连接失败?
    连接字符串文字与字符串在 C 中,运算符可用于连接字符串和字符串文字。但是,此功能存在限制,可能会导致混乱。在问题中,作者尝试连接字符串文字“Hello”、“,world”和“!”以两种不同的方式。第一个例子:const string hello = "Hello"; const...
    编程 发布于2024-11-05
  • React 重新渲染:最佳性能的最佳实践
    React 重新渲染:最佳性能的最佳实践
    React高效的渲染机制是其受欢迎的关键原因之一。然而,随着应用程序复杂性的增加,管理组件重新渲染对于优化性能变得至关重要。让我们探索优化 React 渲染行为并避免不必要的重新渲染的最佳实践。 1. 使用 React.memo() 作为函数式组件 React.memo() 是一个高...
    编程 发布于2024-11-05
  • 如何实现条件列创建:探索 Pandas DataFrame 中的 If-Elif-Else?
    如何实现条件列创建:探索 Pandas DataFrame 中的 If-Elif-Else?
    Creating a Conditional Column: If-Elif-Else in Pandas给定的问题要求将新列添加到 DataFrame 中基于一系列条件标准。挑战在于在实现这些条件的同时保持代码效率和可读性。使用函数应用程序的解决方案一种方法涉及创建一个将每一行映射到所需结果的函数...
    编程 发布于2024-11-05
  • 介绍邱!
    介绍邱!
    我很高兴地宣布发布 Qiu – 一个严肃的 SQL 查询运行器,旨在让原始 SQL 再次变得有趣。老实说,ORM 有其用武之地,但当您只想编写简单的 SQL 时,它们可能会有点让人不知所措。我一直很喜欢编写原始 SQL 查询,但我意识到我需要练习——大量的练习。这就是Qiu发挥作用的地方。 有了 Q...
    编程 发布于2024-11-05

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3