在 React 中创建自定义 Hook 的最佳技巧

在 react 中创建自定义 hook 的最佳技巧

react 的自定义 hooks 是从组件中删除可重用功能的有效工具。它们支持代码中的 dry(不要重复)、可维护性和整洁性。但开发有用的自定义钩子需要牢牢掌握 react 的基本思想和推荐程序。在这篇文章中,我们将讨论在 react 中开发自定义钩子的一些最佳策略,并举例说明如何有效地应用它们。

1。了解 hooks 的用途

在深入创建自定义挂钩之前,了解什么是挂钩以及它们存在的原因至关重要。 hooks 允许您在功能组件中使用状态和其他 react 功能。自定义挂钩使您能够将组件逻辑提取到可重用的函数中,这些函数可以在多个组件之间共享。

示例:基本自定义 hook

这是管理计数器的自定义挂钩的简单示例:

import { usestate } from 'react';function usecounter(initialvalue = 0) {  const [count, setcount] = usestate(initialvalue);  const increment = () => setcount(prevcount => prevcount + 1);  const decrement = () => setcount(prevcount => prevcount - 1);  const reset = () => setcount(initialvalue);  return { count, increment, decrement, reset };}// usage in a component// const { count, increment, decrement, reset } = usecounter(10);

登录后复制

2。遵循命名约定

react 有一个约定,自定义挂钩应以“use”一词开头。这不仅仅是一种风格选择——react 依赖于这个约定来自动应用钩子规则(比如不有条件地调用它们)。

提示:始终使用 use 来启动自定义钩子,以确保 react 知道它是一个钩子。

3。保持钩子纯净

自定义钩子应该是纯函数,这意味着它们不应该有修改全局变量或直接与外部系统交互等副作用。如果需要副作用,例如进行 api 调用,则应使用内置 react 钩子(如 useeffect)在钩子内处理它们。

示例:具有副作用的 hook

import { usestate, useeffect } from 'react';function usefetchdata(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 result = await response.json();        setdata(result);      } catch (err) {        seterror(err);      } finally {        setloading(false);      }    };    fetchdata();  }, [url]);  return { data, error, loading };}// usage in a component// const { data, error, loading } = usefetchdata('https://api.example.com/data');

登录后复制

4。利用现有的 hook
创建自定义挂钩时,请确保利用现有的 react 挂钩,例如 usestate、useeffect、usecontext 等。这确保您的自定义钩子是可组合的,并且可以与 react 的内置功能无缝协作。

示例:组合 hook

这是一个结合 usestate 和 useeffect 来管理本地存储的自定义钩子:

import { usestate, useeffect } from 'react';function uselocalstorage(key, initialvalue) {  const [storedvalue, setstoredvalue] = usestate(() => {    try {      const item = window.localstorage.getitem(key);      return item ? json.parse(item) : initialvalue;    } catch (error) {      console.error(error);      return initialvalue;    }  });  useeffect(() => {    try {      window.localstorage.setitem(key, json.stringify(storedvalue));    } catch (error) {      console.error(error);    }  }, [key, storedvalue]);  return [storedvalue, setstoredvalue];}// usage in a component// const [name, setname] = uselocalstorage('name', 'john doe');

登录后复制

5。可重用性和组合

创建自定义挂钩的主要原因之一是提高可重用性。一个好的自定义钩子应该能够跨多个组件使用,而不需要进行大量修改。此外,钩子可以组合在一起以构建更复杂的逻辑。

提示:专注于提取可能在多个组件之间重用的逻辑。

6。记录你的 hook

像任何代码一样,您的自定义挂钩应该有详细的文档记录。包括解释该钩子的作用、它接受什么参数、它返回什么以及它可能产生的任何副作用的注释。这使其他开发人员(以及未来的您)更容易正确理解和使用您的钩子。

示例:记录 hook

/** * usecounter *  * a custom hook to manage a counter. * * @param {number} initialvalue - initial value of the counter. * @returns {object} { count, increment, decrement, reset } - current count and functions to modify it. */function usecounter(initialvalue = 0) {  // implementation}

登录后复制

7。测试你的 hook

测试对于确保您的自定义挂钩按预期运行至关重要。使用 react-hooks-testing-library 或 jest 等测试库为您的钩子编写单元测试。

示例:hook 的基本测试

import { renderHook, act } from '@testing-library/react-hooks';import useCounter from './useCounter';test('should increment and decrement counter', () => {  const { result } = renderHook(() => useCounter(0));  act(() => {    result.current.increment();  });  expect(result.current.count).toBe(1);  act(() => {    result.current.decrement();  });  expect(result.current.count).toBe(0);});

登录后复制

在整个应用程序中抽象和重用功能的一种有效技术是在 react 中使用自定义挂钩。您可以构建可靠且可维护的钩子,通过理解钩子的用途、遵守命名约定、保持钩子纯净、利用现有钩子、保证可重用性、文档化和测试来改进您的 react 开发过程。

以上就是在 React 中创建自定义 Hook 的最佳技巧的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2669137.html

(0)
上一篇 2025年3月7日 12:40:38
下一篇 2025年2月24日 08:14:00

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Nodejs 的新功能

    TL;DR: 让我们探索 Node.js 22 的主要功能,包括 ECMAScript 模块支持和 V8 引擎更新。此版本引入了 Maglev 编译器和内置 WebSocket 客户端,以增强性能和实时通信。还涵盖了测试、调试和文件系统管理…

    2025年3月7日
    200
  • 使用 JavaScript 释放大型语言模型的力量:实际应用程序

    近年来,大型语言模型 (llm) 彻底改变了我们与技术交互的方式,使机器能够理解和生成类似人类的文本。由于 javascript 是一种用于 web 开发的多功能语言,将 llm 集成到您的应用程序中可以打开一个充满可能性的世界。在这篇博客…

    2025年3月7日
    200
  • 以客户端为中心的错误处理

    了解和处理错误 为了有效地处理错误,必须了解可能发生的错误类型。让我们首先对您可能遇到的错误进行分类。 Web 客户端环境中的错误类型 网络错误 连接问题:与服务器建立连接时出现问题。超时:请求花费太长时间才能收到响应。DNS 错误:域名解…

    2025年3月7日
    200
  • 介绍邱!

    我很高兴地宣布发布 qiu – 一个严肃的 sql 查询运行器,旨在让原始 sql 再次变得有趣。老实说,orm 有其用武之地,但当您只想编写简单的 sql 时,它们可能会有点让人不知所措。我一直很喜欢编写原始 sql 查询,但我意识到我需…

    2025年3月7日
    200
  • CSS 的演变:从基础到现代魔法

    css(即层叠样式表)自 20 世纪 90 年代末首次出现以来,一直是网页设计领域的无名英雄。将其视为网络世界的神奇衣橱——将简单、无聊的 html 转变为视觉上令人惊叹的交互式仙境。在本文中,我们将深入探讨 css 的迷人演变,从它卑微的…

    2025年3月7日
    200
  • 如何使用 Tailwind CSS 和 Javascript 创建组合框

    今天,我们将使用 Tailwind CSS 和 JavaScript 创建一个基本的组合框。这是稍后构建更高级组合框的简单起点。 什么是组合框? 组合框是一个 UI 元素,可让用户快速选择命令或选项。它看起来像一个搜索字段,激活后会显示选项…

    2025年3月7日
    200
  • 如何在 WordPress 网站中使用 Importmap

    我一直在尝试开发一个基本的 wordpress 经典主题,无需构建步骤,我可以将其用作入门主题,以便将来开发客户端站点。在撰写本文时,我没有做任何自由职业,因为我正在为一家网络机构工作,并且我们正在构建的网站都涉及构建步骤。所以我想写一个关…

    2025年3月7日
    200
  • JavaScript 中的展开和休息运算符

    零食故事:假设您有一篮子零食: const snacks = [‘apple’, ‘banana’, ‘chocolate’]; 登录后复制 现在,您想与您的朋友分享这些零食。但你不是把整个篮子都给他们,而是把每件零食都拿出来,一一递给他们…

    2025年3月7日
    200
  • 创建强大的 XSS 多语言

    多语言有效负载利用多种编码、注入和混淆技术来绕过过滤器、混淆解析器,并跨不同上下文(如 html、javascript、css、json 等)触发执行。 -合并评论样式多语言者经常通过合并不同的注释风格来混淆解析器: javascript:…

    2025年3月7日
    200
  • 掌握 JavaScript 异步模式:从回调到异步/等待

    当我第一次遇到异步 javascript 时,我在回调方面遇到了困难,并且不知道 promises 在幕后是如何工作的。随着时间的推移,对 promise 和 async/await 的了解改变了我的编码方法,使其更易于管理。在本博客中,我…

    2025年3月7日
    200

发表回复

登录后才能评论