ahooks
是由蚂蚁开发和维护的一个 高质量 React Hooks 库,专注于提高 React 开发效率。
它封装了大量实用的 Hooks,让你在项目中能少写重复逻辑代码,例如节流、防抖、请求状态管理、轮询、全屏、剪贴板、异步控制等。
ahooks
是什么npm install ahooks
或:
yarn add ahooks
useRequest
:封装请求逻辑(非常强大)import { useRequest } from 'ahooks'
function fetchUser() {
return fetch('/api/user').then(res => res.json())
}
const MyComponent = () => {
const { data, loading, error } = useRequest(fetchUser)
if (loading) return <p>加载中...</p>
if (error) return <p>出错了</p>
return <div>用户名:{data.name}</div>
}
支持:
useDebounceFn
:函数防抖(输入框防抖请求)import { useDebounceFn } from 'ahooks'
const { run } = useDebounceFn((value) => {
console.log('搜索:', value)
}, { wait: 500 })
<input onChange={e => run(e.target.value)} />
useInterval
:定时器封装import { useInterval } from 'ahooks'
useInterval(() => {
console.log('每秒执行一次')
}, 1000)
useLocalStorageState
:用 Hook 管本地存储import { useLocalStorageState } from 'ahooks'
const [name, setName] = useLocalStorageState('name', { defaultValue: '访客' })
<input value={name} onChange={e => setName(e.target.value)} />
useBoolean
:简化布尔值状态操作import { useBoolean } from 'ahooks'
const [visible, { setTrue, setFalse, toggle }] = useBoolean()
<button onClick={toggle}>切换</button>
{visible && <p>内容展示中</p>}
场景 | 是否推荐用 ahooks |
理由 |
---|---|---|
网络请求(带 loading、错误处理、轮询、分页等) | ✅ 强烈推荐 | useRequest 一行代码搞定很多复杂逻辑 |
频繁用的状态管理(boolean、数字、set/map) | ✅ 推荐 | 比如 useBoolean /useCounter /useSet 简洁 |
输入框搜索节流/防抖 | ✅ 推荐 | useDebounceFn 简洁、抽象好 |
节流、定时器、副作用管理 | ✅ 推荐 | useThrottleFn /useInterval 封装更好 |
简单的本地状态管理(useState) | ❌ 不需要 | 原生就够了 |
非 React 项目或只用一次的场景 | ❌ 不必要 | 用原生 Hook 更直观 |
const [value, setValue] = useState('')
const [data, setData] = useState(null)
const [loading, setLoading] = useState(false)
const debounceValue = useDebounce(value, 500) // 你得手写这个 Hook
useEffect(() => {
setLoading(true)
fetch(`/api/search?q=${debounceValue}`)
.then(res => res.json())
.then(data => setData(data))
.finally(() => setLoading(false))
}, [debounceValue])
const { data, loading } = useRequest(
(q) => fetch(`/api/search?q=${q}`).then(res => res.json()),
{
debounceWait: 500,
refreshDeps: [value],
}
)
const [visible, setVisible] = useState(false)
const toggle = () => setVisible(v => !v)
const [visible, { toggle }] = useBoolean(false)
useEffect(() => {
const timer = setInterval(() => {
console.log('tick')
}, 1000)
return () => clearInterval(timer)
}, [])
useInterval(() => {
console.log('tick')
}, 1000)
https://ahooks.js.org/
可以根据分类快速查找需要的 Hook,比如网络请求、状态、UI、性能优化、浏览器特性等。