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

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

发布于2024-11-08
浏览:184

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 hooks 一样,请确保您的组件名称以以下形式开头(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]删除
最新教程 更多>
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-04-30
  • `ConfigurationManager.AppSettings.Set`为何不保存App.Config更改?
    `ConfigurationManager.AppSettings.Set`为何不保存App.Config更改?
    app.config值修改quandary 在提供的代码片段中,尝试修改app.config文件中的值。但是,这种修改并不像预期的那样持续。要识别此问题的来源,让我们深入研究提供的代码并探索潜在问题。代码段: lang =“ Russian”; 私有void main_formclosing(对象...
    编程 发布于2025-04-30
  • 如何避免Go语言切片时的内存泄漏?
    如何避免Go语言切片时的内存泄漏?
    ,a [j:] ...虽然通常有效,但如果使用指针,可能会导致内存泄漏。这是因为原始的备份阵列保持完整,这意味着新切片外部指针引用的任何对象仍然可能占据内存。 copy(a [i:] 对于k,n:= len(a)-j i,len(a); k
    编程 发布于2025-04-30
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-04-30
  • Java开发者如何保护数据库凭证免受反编译?
    Java开发者如何保护数据库凭证免受反编译?
    在java 在单独的配置文件保护数据库凭证的最有效方法中存储凭据是将它们存储在单独的配置文件中。该文件可以在运行时加载,从而使登录数据从编译的二进制文件中远离。使用prevereness class import java.util.prefs.preferences; 公共类示例{ 首选项...
    编程 发布于2025-04-30
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-04-30
  • MySQL中如何保持UTF8编码的表格输出格式?
    MySQL中如何保持UTF8编码的表格输出格式?
    在使用包含非英语字符的MySQL数据库时,请使用MySQL命令行表达式输出格式格式化,而在切换到utf8编码时,表格查询结果的输出格式可能会中断。本文提供了解决此格式问题的综合指南。简短答案 使用-default-character-character-set = utf8选项将mysql cli...
    编程 发布于2025-04-30
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-04-30
  • FastAPI自定义404页面创建指南
    FastAPI自定义404页面创建指南
    response = await call_next(request) if response.status_code == 404: return RedirectResponse("https://fastapi.tiangolo.com") else: ...
    编程 发布于2025-04-30
  • 如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求和假用户代理绕过网站块?
    如何使用Python的请求模拟浏览器行为,以及伪造的用户代理提供了一个用户 - 代理标头一个有效方法是提供有效的用户式header,以提供有效的用户 - 设置,该标题可以通过browser和Acterner Systems the equestersystermery和操作系统。通过模仿像Chro...
    编程 发布于2025-04-30
  • SQL Server 2008整数时间转换为HH:MM:SS:00格式方法
    SQL Server 2008整数时间转换为HH:MM:SS:00格式方法
    Converting Integer Time to HH:MM:SS:00 Format in SQL Server 2008In SQL Server 2008, converting an integer time value to the HH:MM:SS:00 format involve...
    编程 发布于2025-04-30
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-04-30
  • 如何从2D数组中提取元素?使用另一数组的索引
    如何从2D数组中提取元素?使用另一数组的索引
    Using NumPy Array as Indices for the 2nd Dimension of Another ArrayTo extract specific elements from a 2D array based on indices provided by a second ...
    编程 发布于2025-04-30
  • Python学习日记:For循环与If条件语句的实践
    Python学习日记:For循环与If条件语句的实践
    句法: 对于序列的变量 例子: txt ='1234' 对于txt中的num: 打印(num,end ='') 输出: 1 2 3 4 如果条件: if语句通过检查表达式来查看是否满足条件并根据获得的输出返回值。 句法: 如果条件: 如果条件为真 ...
    编程 发布于2025-04-30
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-04-30

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

Copyright© 2022 湘ICP备2022001581号-3