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

React 中的自定义 Hook

发布于2024-11-04
浏览:302

Custom Hooks in React

React 中的自定义 Hook 是一项强大的功能,允许您跨多个组件提取和重用逻辑。它们使您能够封装复杂的状态逻辑,使您的组件更干净且更易于维护。以下是如何创建和使用自定义挂钩的快速概述和示例。

创建自定义钩子

自定义钩子本质上是一个 JavaScript 函数,其名称以 use 开头,并且可以调用其中的其他钩子。这是管理计数器的自定义挂钩的简单示例:

import { useState } from 'react';

// Custom Hook: useCounter
function useCounter(initialValue = 0) {
    const [count, setCount] = useState(initialValue);

    const increment = () => setCount(c => c   1);
    const decrement = () => setCount(c => c - 1);
    const reset = () => setCount(initialValue);

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

export default useCounter;

使用自定义挂钩

您可以在任何功能组件中使用 useCounter 钩子:

import React from 'react';
import useCounter from './useCounter';

function CounterComponent() {
    const { count, increment, decrement, reset } = useCounter(0);

    return (
        

Count: {count}

); } export default CounterComponent;

要点

  1. 命名约定:自定义钩子的名称始终以 use 开头,以遵循 React 的约定。
  2. 可重用性:自定义挂钩可以在多个组件中重用,促进 DRY(不要重复自己)代码。
  3. 状态管理:您可以管理状态、执行副作用以及利用自定义挂钩中的其他挂钩。

高级示例:获取数据

这是用于获取数据的更高级的自定义挂钩:

import { useState, useEffect } from 'react';

function useFetch(url) {
    const [data, setData] = useState(null);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);

    useEffect(() => {
        const fetchData = async () => {
            try {
                const response = await fetch(url);
                if (!response.ok) throw new Error('Network response was not ok');
                const result = await response.json();
                setData(result);
            } catch (error) {
                setError(error);
            } finally {
                setLoading(false);
            }
        };

        fetchData();
    }, [url]);

    return { data, loading, error };
}

export default useFetch;

用法

您可以在组件中使用useFetch钩子来获取数据:

import React from 'react';
import useFetch from './useFetch';

function DataFetchingComponent() {
    const { data, loading, error } = useFetch('https://api.example.com/data');

    if (loading) return 

Loading...

; if (error) return

Error: {error.message}

; return (

Data:

{JSON.stringify(data, null, 2)}
); } export default DataFetchingComponent;
); } 导出默认的DataFetchingComponent;

自定义挂钩是以干净且可维护的方式封装逻辑并在组件之间共享功能的好方法。

版本声明 本文转载于:https://dev.to/imyusufakhtar/custom-hooks-in-react-2mk4?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-11-18
  • 如何从 JavaScript 单击事件调用 ASP.NET 方法?
    如何从 JavaScript 单击事件调用 ASP.NET 方法?
    从 JavaScript 访问 ASP.NET 函数要从 JavaScript 的单击事件调用 ASP.NET 方法,可以使用非标准方法:受雇。这里有详细的指南:使用 IPostBackEventHandler 接口增强 Page 类:在您的 ASP.NET 代码文件中,使用以下代码继承 Page ...
    编程 发布于2024-11-18
  • 您可以在 JavaScript 中的条件语句内声明函数吗?
    您可以在 JavaScript 中的条件语句内声明函数吗?
    条件语句中的函数声明在 JavaScript 中,函数声明具有不同的行为,具体取决于流行的语言标准及其执行环境。 严格模式 (ES5)严格模式,在 ECMAScript 5 中引入(ES5),条件语句中不允许使用函数声明。这是因为函数声明创建了提升变量,这些变量的作用域为整个函数或全局作用域。将它们...
    编程 发布于2024-11-18
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-18
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-18
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-18
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-18
  • 复杂的查询条件应该在数据映射器还是服务层处理?
    复杂的查询条件应该在数据映射器还是服务层处理?
    如何处理复杂查询条件:Data Mapper vs. Service Layer面向对象编程中处理复杂查询条件时,有主要有两种方法:在数据映射器或服务层中处理它们。数据映射器方法数据映射器模式用于将域对象映射到和来自数据库。在处理条件的上下文中,数据映射器可以具有接受条件列表的通用 get() 方法...
    编程 发布于2024-11-18
  • 当前MySQL root密码为空时如何重置?
    当前MySQL root密码为空时如何重置?
    重置 MySQL Root 密码当使用空密码以 root 身份登录时遇到困难,通过传统方式修改它可能会面临挑战方法。本文探讨了强制重置 root 密码的替代解决方案。强制密码重置:创建密码重置脚本:首先制作一个包含以下命令的脚本:UPDATE mysql.user SET Password=PASS...
    编程 发布于2024-11-18
  • 如何使用 C 或 C++ 中的 Win32 API 从 DLL 和 EXE 检索版本信息?
    如何使用 C 或 C++ 中的 Win32 API 从 DLL 和 EXE 检索版本信息?
    获取 DLL 和 EXE 的版本信息许多应用程序需要能够从文件中检索版本信息。此信息用于显示目的,例如在属性对话框上显示版本号。Win32 API 提供了多个可用于获取版本信息的函数。一种常见的方法是使用 GetFileVersionInfo API。使用 GetFileVersionInfoGet...
    编程 发布于2024-11-18
  • 如何从同一本地网络上的另一台计算机访问 FastAPI 后端?
    如何从同一本地网络上的另一台计算机访问 FastAPI 后端?
    如何从同一本地网络上的不同计算机/IP 访问 FastAPI 后端从同一本地网络上的不同计算机访问 FastAPI 后端同一本地网络,必须确保以下几点:1.主机标志配置:运行FastAPI服务器时将主机标志设置为0.0.0.0。这允许服务器侦听本地计算机上的所有可用 IP 地址。2。防火墙调整:确保...
    编程 发布于2024-11-18
  • 使用 Symbol.iterator 控制循环
    使用 Symbol.iterator 控制循环
    您是否曾经使用过 Object.entries 并想知道它是如何工作的?比你想象的要简单得多! 这是一个基本实现: function objectEntries(obj) { const entries = []; for (const key in obj) { if (Objec...
    编程 发布于2024-11-18
  • 如何在 Python 中找到两个列表之间的差异?
    如何在 Python 中找到两个列表之间的差异?
    在 Python 中计算列表差异在 Python 中处理列表时,理解两个列表之间的差异至关重要。有多种方法可以实现这一目标,每种方法都有自己的优点和应用。最常见的方法之一是使用集合差值。集合差值集合差值是一种数学运算,用于计算一个集合中存在但不存在的元素其他。应用于列表时,可以有效突出显示两个列表之...
    编程 发布于2024-11-18
  • 在 React 中缓存数据:提升性能和用户体验
    在 React 中缓存数据:提升性能和用户体验
    在 React 中缓存数据可以通过减少多次获取相同数据的需要来显着提高性能和用户体验。以下是React中实现数据缓存的几种方法: 1. 使用状态管理库 Redux:使用 Redux 将您的数据存储在集中存储中。您可以在 Redux 状态下缓存 API 响应,并且仅在数据不可用时才获取...
    编程 发布于2024-11-18
  • PythonW.exe 与 Python.exe:我什么时候应该使用它们?
    PythonW.exe 与 Python.exe:我什么时候应该使用它们?
    PythonW.exe 与 Python.exe:何时使用每个主要差异摘要:python.exe:CLI 控制台应用程序脚本打开控制台窗口连接到控制台的标准流同步执行pythonw .exe:GUI/无 UI 的 GUI 应用程序脚本没有打开控制台窗口异步执行标准流不可用场景分析: 在您的例子中,您...
    编程 发布于2024-11-18

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

Copyright© 2022 湘ICP备2022001581号-3