发布于 2026-01-05 1 阅读
0

十大 React Hooks 库 DEV 全球展示挑战赛,由 Mux 呈现:展示你的项目!

十大 React Hooks 库

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

Hooks通过帮助开发者编写更少的代码行数、更简洁、更易读、更易维护、更易重用的代码,从而简化了他们的工作。许多流行的库现在都提供了 Hooks,今天我们就来了解一下其中的一些。

1. 使用http

use-http是一个流行的包,用于替代 Fetch API。它是一个维护良好的库,只需几行代码即可轻松集成。它使用 TypeScript 编写钩子,支持服务器端渲染 (SSR)GraphQL。它会返回响应、加载信息和错误数据,并支持不同的请求方法,包括 GET、POST、PUT、PATCH 和 Delete。

特征 -

  • 请求/响应拦截器
  • 组件卸载时中止/取消待处理的 HTTP 请求
  • 重试功能
  • 内置缓存
  • TypeScript 支持

GitHub 自述文件中有详细的文档说明,包括 CodeSanbox 示例和 YouTube 视频。

安装 - npm i use-http

一体化 -

import React, { useEffect, useState } from 'react';
import useFetch from 'use-http'

function UseHTTPExample() {
  const [todos, setTodos] = useState([])
  const { get, post, response, loading, error } = useFetch('https://jsonplaceholder.typicode.com')

  useEffect(() => { initializeTodos() }, []);

  async function initializeTodos() {
    const initialTodos = await get('/todos')
    if (response.ok) setTodos(initialTodos)
  }

  async function addTodo() {
    const newTodo = await post('/todos', { title: 'KPITENG Article Writting' })
    if (response.ok) setTodos([newTodo, ...todos])
  }

  return (
    <>
      <button onClick={addTodo}>Add Todo</button>
      {error && 'Error!'}
      {loading && 'Loading...'}
      {todos.map(todo => (
        <div key={todo.id}>{todo.title}</div>
      ))}
    </>
  )
}
export default UseHTTPExample;
Enter fullscreen mode Exit fullscreen mode

2. Redux Hooks

Redux是最流行的状态管理库之一,大多数开发者都在使用 Redux。Redux Hooks 为 HOC(高阶组件)模式提供了一种替代方案,它利用现有的 connect() 方法,简化了连接到 store、获取数据和分发 action 的过程。让我们一起来看看。

热门的 Redux Hooks -

  • 使用选择器
  • 使用调度
  • 使用商店

安装 - npm i react-redux @types/react-redux

一体化 -

import { useSelector, useDispatch } from "react-redux";
import React from "react";
import * as actions from "./actions";

const ReduxHooksExample = () => {
  const dispatch = useDispatch();
  const counter = useSelector((state) => state.counter);

  return (
    <div>
      <span>{counter.value}</span>
      <button onClick={() => dispatch(actions.incrementCounter)}>
        Counter +1
      </button>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

3. 使用媒体

你是否曾遇到过管理 CSS 媒体查询的问题?useMedia hook 用一行代码就能轻松解决这个问题。它是一个感知型 hook,可以跟踪 CSS 媒体查询的状态,帮助你设计和开发响应式应用。

useMedia 是一个用 TypeScript 编写的包。该包拥有结构清晰的文档,解释了其用法和测试方法。

安装 - npm i use-media

一体化 -

const ResponsiveComponent = () => {
    const isWide = useMedia({ minWidth: "1000px" });

    return (
      <span>
        Screen is wide: {isWide ? "It's WideScreen" : "It's NarrowScreen"}
      </span>
    );
  };
Enter fullscreen mode Exit fullscreen mode

4. React Hook 表单

React Hook Form是一个表单钩子库,它类似于 Formik 和 Redux Form,但更简洁、更快速、渲染次数更少。useForm 函数返回 register、handleSubmit 和 errors 三个参数。register 用于注册表单元素,handleSubmit 管理提交操作,errors 用于管理验证并显示输入错误。

安装 - npm i react-hook-form

一体化 -

import React from "react";
import { useForm } from "react-hook-form";

function SignUpComponent() {
  const { register, handleSubmit, errors } = useForm();
  const onSubmit = (data) => {
    // logs {firstName:"exampleFirstName", lastName:"exampleLastName"}
    console.log(data);
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input name="firstName" ref={register} />
      <input name="lastName" ref={register({ required: true })} />
      {errors.lastName && <span>"Last name is a mandatory field."</span>}
      <input name="age" ref={register({ required: true })} />
      {errors.age && <span>"Please enter number for age."</span>}
      <input type="submit" />
    </form>
  );
}
Enter fullscreen mode Exit fullscreen mode

5. 国度

Constate hook 可以将本地状态提升到 React Context 层级。因此,您只需几行代码即可在应用程序的任何位置访问/更新状态变量。当您在多个组件中使用相同的状态时,这非常有用。例如,您可能在多个组件中使用了主题、颜色和字体,用户可以在一个地方更改这些设置,并且更改应该反映在整个应用程序中。该包使用 TypeScript 编写,非常精简。

安装 - npm i constate

一体化 -

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

// custom hook
function useCounter() {
  const [count, setCount] = useState(0);
  const increment = () => setCount(prevCount => prevCount + 1);
  return { count, increment };
}

// hook passed in constate
const [CounterProvider, useCounterContext] = constate(useCounter);

function Button() {
  // use the context
  const { increment } = useCounterContext();
  return <button onClick={increment}>+</button>;
}

function Count() {
  // use the context
  const { count } = useCounterContext();
  return <span>{count}</span>;
}

function App() {
  // wrap the component with provider
  return (
    <CounterProvider>
      <Count />
      <Button />
    </CounterProvider>
  );
Enter fullscreen mode Exit fullscreen mode

6. 使用防抖

useDebounce hooks——顾名思义——用于防抖动。它的作用类似于 React Native 中的 setTimeout,可以将代码执行延迟到稍后的时间。

安装 - npm i use-debounce

一体化 -

import React, { useState } from "react";
import { useDebounce } from "use-debounce";

export default function UseDebounceExample() {
  const [text, setText] = useState("Hello KPITENG");
  const [value] = useDebounce(text, 3);

  return (
    <div>
      <input
        defaultValue={"Hello"}
        onChange={(e) => {
          setText(e.target.value);
        }}
      />
      <p>Value: {text}</p>
      <p>Debounced value: {value}</p>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

7. React Router Hooks

React Router是一个流行的库,用于组件路由、组件历史记录管理等等。

热门路由器挂钩 -

  • 使用历史记录
  • 使用位置
  • 使用参数
  • 使用路由匹配

useHistory 帮助开发者管理组件的导航历史记录。useLocation 返回表示当前 URL 的对象,用于管理基于 URL 的用例。useParams 返回组件间路由时传递的参数。useRouteMatch 将当前 URL 与给定的字符串进行匹配,以执行相应的用例。

安装 - npm i react-router-dom

一体化 -

import { useHistory, useLocation, useRouteMatch } from "react-router-dom";

const RouteExample = () => {
  let history = useHistory();
  let location = useLocation();
  let isMatchingURL = useRouteMatch("/blog/33");

  function handleClick() {
    history.push("/home");
  }

  return (
    <div>
      <span>Current URL: {location.pathname}</span>
      {isMatchingURL ? <span>Matching provided URL! </span> : null}
      <button type="button" onClick={handleClick}>
        Go home
      </button>
    </div>
  );
};
Enter fullscreen mode Exit fullscreen mode

8. 使用悬停

useHover hooks 用于识别鼠标悬停的 React 元素。它非常易于使用和集成,并且还可以控制悬停效果的延迟。useHover 支持 TypeScript。

安装 - npm i react-use-hover

一体化 -

import useHover from "react-use-hover";

const HoverExample = () => {
  const [isHovering, hoverProps] = useHover();
  return (
    <>
      <span {...hoverProps} aria-describedby="overlay">
        Hover me
      </span>
      {isHovering ? <div> Hey, you hover me! </div> : null}
    </>
  );
};
Enter fullscreen mode Exit fullscreen mode

9. 使用门户

usePortal钩子允许在应用程序 DOM 层级结构之外创建元素。usePortal 广泛应用于下拉菜单、通知弹出窗口、模态框和工具提示等场景。由于 usePortal 与服务器端渲染 (SSR) 具有同构性,因此可以与之配合使用。usePortal 使用 TypeScript 编写,允许自定义门户样式以及更多其他选项。

usePortal 有一个定义完善的 Github readme,其中包含针对每个 SSR、模态框、下拉菜单、工具提示的代码示例。

安装 - npm i react-useportal

一体化 -

import React, { useState } from "react";
import usePortal from "react-useportal";

const UsePortalExample = () => {
  const { ref, openPortal, closePortal, isOpen, Portal } = usePortal();

  return (
    <>
      <button ref={ref} onClick={() => openPortal()}>
        Open Portal
      </button>
      {isOpen && (
        <Portal>
          <p>
            This Portal handles its own state.{" "}
            <button onClick={closePortal}>Close me!</button>, hit ESC or click
            outside of me.
          </p>
        </Portal>
      )}
    </>
  );
};
Enter fullscreen mode Exit fullscreen mode

10. 使用本地存储

useStorage hook 允许开发者从 localStorage 中提取数据并将其保存。它会自动进行 JSON 序列化和同步。useLocalStorage 使用 TypeScript 编写,因此它提供了类型信息。

安装 - npm i @rehooks/local-storage

一体化 -

import React, { useState } from "react";
import { writeStorage, useLocalStorage } from '@rehooks/local-storage';

const UseLocalStorageExample() {
  let counter = 0;
  const [counterValue] = useLocalStorage('counterValue');

  return (
    <div>
      <span>{counterValue}</span>
      <button onClick={() => writeStorage('i', ++counter)}>
        Click Me
      </button>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

感谢阅读博客!

KPITENG | 数字转型
www.kpiteng.com/blogs | hello@kpiteng.com
联系我们 | 关注我们 - LinkedIn | Facebook | Instagram

文章来源:https://dev.to/kpiteng/top-10-react-hooks-library-3m38