被低估的 React Hooks 什么是自定义 Hooks 👐 useLocalStorage 📍 useDarkMode 🌕🌗🌑 useClippy 📋 结论 👊

2025-06-10

被低估的 React Hooks

什么是自定义 Hooks 👐

useLocalStorage 📍

使用暗黑模式🌕🌗🌑

useClippy 📋

结论👊

什么是自定义 Hooks 👐

考虑到大部分 React 粉丝已经转而使用函数式组件,对钩子的需求也随之增加,所以今天,我将向大家介绍 3 个我觉得没有得到应有重视的自定义钩子。

但首先,什么是自定义钩子?如何创建它?根据 React 文档,自定义钩子是“一个名称以 'use' 开头的 JavaScript 函数,它可以调用其他钩子”。它们通常会返回一个值和一个可以修改该值的函数。例如,以下setState钩子:

const [state, setState] = useState("initialValue")
Enter fullscreen mode Exit fullscreen mode

返回解构后statesetState。所以,当你创建自己的自定义钩子时,你也可以这样做。其实很简单。创建自定义钩子时,你可以利用之前创建的钩子并添加更多功能。下面的 useLocalStorage 钩子就是这样创建的。

自定义钩子提供了一个抽象层,使你的代码更易于阅读,并能提高你的工作效率。我建议你在下一个 React 项目中尝试自定义钩子,因为它们可以用来添加任何功能。例如,下面列出的三个钩子允许你使用本地存储、在明暗模式之间切换以及操作浏览器剪贴板。

useLocalStorage 📍

undraw_Memory_storage_reh0

感谢usehooks.comWeb Dev Simplified提供此帮助

如果您不熟悉 localStorage API,它的工作原理与Cookie非常相似,它允许您将用户数据保存在浏览器中,以便在用户刷新页面或关闭网站时不会丢失。这对于在调色板网站上保存用户的调色板非常有用,而无需强制用户注册。在 localStorage 中,数据以 JSON 格式存储,因此您需要一个键和一个值来表示数据。

useLocalStorage 钩子本质上就是 useState 钩子,但每个状态也会保存到 localStorage 中。一个实际应用是保存用户当前歌曲和已保存的歌曲,我在制作个人音乐播放器时就用过这个功能。在下面我从项目中提取的代码中,你可以看到我刚刚在 useState 钩子上进行了构建:

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

export default function useLocalStorage(key, value) {
    const [state, setState] = useState(value)

    useLayoutEffect(() => {
        const data = localStorage.getItem(key)
        setState(JSON.parse(data))
    }, [])

    useEffect(() => {
        localStorage.setItem(key, JSON.stringify(state))
        }, [state])

    return [state, setState]
}
Enter fullscreen mode Exit fullscreen mode

让我解释一下此代码片段的各个部分:

  • useLocalStorage(key, value)- 与 useState 类似,此钩子将接受初始值,但也需要一个键

  • const [state, setState] = useState(value)- 使用值参数初始化状态

  • useLayoutEffect(...)- 使用了两个 useEffect,但第一个用于从 localStorage 中获取数据,由于没有依赖项,它只在组件挂载时运行一次。我使用了 useLayoutEffect,因为它在组件挂载之前运行,而不是挂载之后。这可以避免内容渲染默认数据,然后在一秒后切换到 localStorage 数据的问题。

  • useEffect(...)- 第二个 useEffect 用于将新状态设置为 localStorage,并将状态作为依赖项,以便每次状态更改时都会保存到 localStorage。阅读此文,了解更多关于 localStorage 方法的信息,例如我上面使用的 setItem 和 getItem。

  • return [state, setState]- 这是将函数设置为钩子的部分。现在你可以用这个函数替换所有对 setState 的调用,因为它也可以用相同的方式解构。你只需要将键添加为第一个参数即可。

使用暗黑模式🌕🌗🌑

黑暗模式-5771054_1280

在现代,黑暗模式对于任何作品集网站来说都是必不可少的,那么为什么不创建一个可重复使用的钩子来简化流程呢?

对于这个钩子,我不会展示它的代码,因为它有点高级,但你可以在这里查看。尽管如此,我仍然会向你展示如何在定义它之后使用它。这个钩子实际上返回一个对象,该对象包含切换、启用和禁用暗黑模式所需的值和函数,但它仍然是相同的概念,只是以不同的方式编写。你需要编写一些 CSS 来配置亮黑模式的外观,但切换可以通过钩子来处理。

import useDarkMode from 'use-dark-mode';

const DarkModeToggle = () => {
  const darkMode = useDarkMode(false);

  return (
    <div>
      <button type="button" onClick={darkMode.disable}>
        
      </button>
      <input type="checkbox" checked={darkMode.value} onChange={darkMode.toggle} />
      <button type="button" onClick={darkMode.enable}>
        
      </button>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

代码解释:

  • const darkMode = useDarkMode(false)- 传递给钩子的“false”指定它将默认处于灯光模式

  • \<button type="button" onClick={darkMode.disable}>- 由于钩子的返回值是一个对象,因此可以调用 darkMode.disable 来改变状态

  • \<input type="checkbox" checked={darkMode.value} onChange={darkMode.toggle} />- 钩子返回的值要么是 true 要么是 false,因此您可以使用“checked”属性将复选框或切换按钮设置为正确的模式

useClippy 📋

undraw_photocopy_gj0t

useClippy 是一个钩子,允许你查看复制/粘贴剪贴板并将项目复制到剪贴板。例如,它可以用于制作一个按钮,点击后会复制 URL。

再次强调,对于这个钩子,我将只展示用于应用它的代码,但你可以在这里查看实际的钩子(虽然是用 Typescript 编写的)

import useClippy from 'use-clippy';

export default function MyComponent() {
  const [clipboard, setClipboard] = useClippy();

  return (
    <div>
      <button
        onClick={() => {
          alert(`Your clipboard contains: ${clipboard}`);
        }}
      >
        Read my clipboard
      </button>

      <button
        onClick={() => {
          setClipboard(`Random number: ${Math.random()}`);
        }}
      >
        Copy something new
      </button>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

代码解释:

  • const [clipboard, setClipboard] = useClippy();- useClippy 的解构方式与 useState 相同,但返回剪贴板上的最后一项以及保存到剪贴板的函数

  • <button>...</button>- 按钮从剪贴板中抓取最后的内容,并在单击时将新项目设置到剪贴板(非常不言自明)

结论👊

请随意留下您发现或制作的任何未列入此列表的自定义钩子。

鏂囩珷鏉ユ簮锛�https://dev.to/salarc123/undererated-react-hooks-jek
PREV
React 中的 3 个高级 Framer 运动效果
NEXT
项目式学习的优势:它与课程式学习有何不同?🧐 优点 🎉 缺点 🚨 结论 😎