首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau
百百 BLOG
首頁
學習紀錄
遊戲心得影視Life書單案件檔案
Side Projects委託作品與二創互動實驗場
Kurau

Kurau Blog

「隨心而寫,真真假假,都是我」

一個記錄生活、輸出興趣的個人空間。
遊戲、影視、閱讀、學習……每一段體驗都值得留下文字。

頁面導覽

  • 學習紀錄
  • 遊戲心得
  • 影視Life
  • 書單
  • 委託作品與二創
  • Kurau
  • 合作邀請

找到我

歡迎來 Discord 找我聊天!

“曾經發生的事不可能忘記,只是暫時想不起來而已。”-《神隱少女》

© 2026 Kurau All rights reserved

前端框架

React-Use套件

By Kurau·2023-03-08·Updated 2026-05-09·4 分鐘閱讀

react-use 套件

TL;DR
react-use 是 React Hooks 集合,提供 100+ 個常用 hook(useDebounce / useLocalStorage / useOnClickOutside / useWindowSize 等)。減少重複實作的 utility hooks。注意 useWheel 屬於 react-use-gesture 不是 react-use,容易搞混。

安裝

npm install react-use
bash

最常用的 Hooks(精選)

State / Storage

Hook用途
useToggletrue/false 切換
useCounter計數器(inc / dec / set)
useLocalStorage綁定 localStorage 的 state
useSessionStorage同上,sessionStorage 版
usePrevious取上一次 render 的值
useFirstMountState判斷是否為首次 render

UI / DOM

Hook用途
useClickAway點擊元素外部 觸發
useHover是否 hover
useFocus / useFocusWithinfocus 狀態
useKey監聽某個 key
useWindowSize視窗尺寸(會跟著 resize)
useScroll滾動位置
useIntersectionIntersectionObserver wrapper

Lifecycle / Async

Hook用途
useDebouncedebounce 一個 effect
useThrottlethrottle 一個 effect
useTimeout / useInterval安全的計時器(會自動 cleanup)
useMount / useUnmountmount / unmount 一次性 effect
useUpdateEffect跳過首次 render 的 effect
useAsync處理 async 函式 + state

Browser API

Hook用途
useNetworkState網路連線狀態
useBattery電池資訊
useGeolocation地理位置
useMediamedia query 監聽
useClipboard剪貼簿讀寫

範例:useLocalStorage

最常用、最香的一個:

import { useLocalStorage } from 'react-use';

function Settings() {
  const [theme, setTheme] = useLocalStorage('theme', 'light');

  return (
    <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
      Toggle ({theme})
    </button>
  );
}
tsx

自動 JSON 序列化、自動同步多分頁、refresh 後保留。比自己寫 useEffect + getItem/setItem 省 20 行。


範例:useClickAway

import { useRef } from 'react';
import { useClickAway } from 'react-use';

function Dropdown({ onClose }: { onClose: () => void }) {
  const ref = useRef<HTMLDivElement>(null);
  useClickAway(ref, onClose);

  return <div ref={ref}>下拉選單內容</div>;
}
tsx

下拉選單、modal、popover 必備。自己實作要處理 mousedown vs click、touch 事件、stopPropagation 等,套件已搞定。


範例:useDebounce

import { useState } from 'react';
import { useDebounce } from 'react-use';

function Search() {
  const [input, setInput] = useState('');
  const [debounced, setDebounced] = useState('');

  useDebounce(() => {
    setDebounced(input);
    // 觸發 API 搜尋
    fetch(`/api/search?q=${input}`);
  }, 500, [input]);

  return <input value={input} onChange={(e) => setInput(e.target.value)} />;
}
tsx

500ms 沒打字才觸發 API,標準 search-as-you-type pattern。


⚠️ 常見搞混:useWheel 不在這裡!

// ❌ 這個會錯,react-use 沒有 useWheel
import { useWheel } from 'react-use';

// ✅ useWheel 在 @use-gesture/react(原 react-use-gesture)
import { useWheel } from '@use-gesture/react';
tsx
npm install @use-gesture/react
bash

@use-gesture 是 同作者 的另一個套件,專做手勢 / 拖曳 / 滾輪等複雜互動。

useWheel 範例:圖片縮放

import { useWheel } from '@use-gesture/react';
import { useState } from 'react';

function ZoomImage({ src }: { src: string }) {
  const [scale, setScale] = useState(1);

  const bind = useWheel(({ delta: [, dy] }) => {
    setScale((prev) => {
      const next = prev + dy / 100;
      return Math.min(Math.max(next, 0.1), 3);  // 0.1 ~ 3 之間
    });
  });

  return (
    <div {...bind()} style={{ transform: `scale(${scale})` }}>
      <img src={src} alt="" />
    </div>
  );
}
tsx

bind() 是個函式,要呼叫才會回傳 props 物件,別忘了括號。


套件大小考量

react-use 的 tree-shaking 友善,只 import 用到的 hook,bundle 不會吃整包:

// ✅ 只進 useDebounce 那一個
import { useDebounce } from 'react-use';
tsx

不過如果只用 1-2 個 hook,可以考慮直接抄 source 進專案,省一個依賴。


替代選擇

套件規模特色
react-use100+ hooks綜合萬用
usehooks-ts~30 hooksTypeScript first、輕
ahooks60+ hooks阿里出品、商業導向
react-use-gesture / @use-gesture專注手勢拖曳、滾輪、捏合
2026 年建議
個人專案 / 小工具 → usehooks-ts(輕、TS 完整)。需要大量瀏覽器 API hook → react-use。手勢互動 → @use-gesture。

目錄

    ◆ 相關文章

    • HTML React 打字機效果

      2026-05-09
    • Framer Motion 打造比最棒還要棒的動畫

      2026-05-09
    • Redux

      2026-05-09
    • react-app-env.d.ts

      2026-05-09
    ← 上一篇React-Router-Dom V6 Anchor Link下一篇 →Webpack遇到的問題

    ◆ 關於作者

    Kurau

    個人寫作 / 創作的 SoT,記錄遊戲、影視、學習與生活。

    更多 Kurau 的文章