首页 > 应用开发 > IT综合 > 10 个好用的自定义 React Hooks

Hooks 使我们能够在功能组件中使用状态和生命周期特性,从而彻底改变了我们编写 React 组件的方式。
但为什么只停留在
useState
和
useEffect
?
在本文中,我们将探索 10 个巧妙的钩子,它们可以帮助您升级 React 游戏并创建更简洁、更高效的代码。
import
{ useState, useEffect }
from
'react'
const
useFetchData
= (
url:
string
) => {
const
[data, setData] =
useState
(
null
)
const
[loading, setLoading] =
useState
(
true
)
useEffect
(
() =>
{
setLoading
(
true
)
fetch
(
url)
.
then
(
response
=>
response.json
())
.
then
(
data
=>
{
setData
(data)
setLoading
(
false
)
})
}, [url])
return
{ data, loading }
}
useFetchData
是一个自定义挂钩,可简化获取数据和管理加载状态的过程。
传入一个 URL,它将返回一个包含获取的数据和一个加载布尔值的对象。
这个钩子提高了代码的可重用性并保持你的组件干净。
import
{ useState, useEffect }
from
'react'
const
useDebounce
= (
value:
any
, delay:
number
) => {
const
[debouncedValue, setDebouncedValue] =
useState
(value)
useEffect
(
() =>
{
const
handler =
setTimeout
(
() =>
{
setDebouncedValue
(value)
}, delay)
return
() =>
{
clearTimeout
(handler)
}
}, [value, delay])
return
debouncedValue
}
useDebounce
是一个钩子,它以指定的延迟对给定值进行去抖动。
这对于您希望延迟 API 调用或其他操作直到用户停止输入的输入字段特别有用。
import
{ useRef, useEffect }
from
'react'
const
usePrevious = <T
extends
unknown
>(
value
: T): T |
undefined
=>
{
const
ref = useRef<T>()
useEffect
(
() =>
{
ref.current
= value
}, [value])
return
ref
.
当前
}
usePrevious
是一个简单的钩子,用于存储给定变量的先前值。
当您需要将当前值与前一个值进行比较时,这会很方便,例如检测表单或数据列表中的更改。
import
{ useState, useEffect }
from
'react'
const
useLocalStorage = <T
extends
unknown
>(
key
:
string
,
initialValue
: T
): [T,
(
value: T
) =>
void
] => {
const
[storedValue, setStoredValue] = 复制代码
useState
<T>( ()
=
>
{
try
{
const
item =
window
.localStorage
.getItem
(
key)
return
item ?
JSON
.parse
(item) : initialValue
}
赶上
(错误){
控制台
。
error
(error)
return
initialValue
}
})
const
setValue
= (
value: T
) => {
try
{
setStoredValue
(value)
窗口
。
本地存储
。
setItem
(key,
JSON
.
stringify
(value))
}
catch
(error) {
控制台
.
错误
(错误)
}
}
返回
[storedValue,setValue]
}
useLocalStorage
是一个自定义挂钩,可简化localStorage
的使用
。
它提供了一个干净的接口,用于在处理 JSON 序列化和错误处理时获取和设置 localStorage 中的值。
import
{ useState, useCallback}
from
'react'
const
useToggle = (
initialValue
:
boolean
): [
boolean
,
() =>
void
] => {
const
[value, setValue] =
useState
(initialValue)
const
toggleValue =
useCallback
(
() = >
{
setValue
(
prevValue
=>
!prevValue)
}, [])
return
[value, toggleValue]
}
useToggle
是一个简单的钩子,允许您切换布尔值。
这在处理模式、下拉列表和其他需要打开和关闭的 UI 元素时特别有用。
import
{ useState, useEffect }
from
'react'
const
useKeyPress = (
targetKey
:
string
):
boolean
=>
{
const
[keyPressed, setKeyPressed] =
useState
(
false
)
const
downHandler
= (
{ key }: KeyboardEvent
) => {
if
(key === targetKey) {
setKeyPressed
(
true
)
}
}
const
upHandler
= (
{ key }: KeyboardEvent
) => {
if
(key === targetKey) {
setKeyPressed
(
假
)
}
}
useEffect
(
()=>
{
window.addEventListener
(
'keydown'
,
downHandler)
window.addEventListener
(
'keyup'
,
upHandler
)
return (
)
=>
{
window.removeEventListener
(
'
keydown
'
,downHandler)
window
。
removeEventListener
(
'keyup'
, upHandler)
}
}, [targetKey])
返回
keyPressed
}
useKeyPress
是一个钩子,用于侦听特定的按键并返回一个布尔值,指示当前是否按下该键。
这在构建键盘快捷键或处理键盘导航时很有用。
import
{ useEffect, useRef }
from
'react'
const
useInterval
= (
callback: () =>
void
, delay:
number
|
null
) => {
const
savedCallback =
useRef
(callback)
useEffect
(
() =>
{
savedCallback.current
=
callback
}, [callback])
useEffect
(
() =>
{
if (
delay
!==
null
) {
const
id =
setInterval
(
() =>
savedCallback.current
(), delay)
return
() =>
clearInterval
(id)
}
}, [延迟])
}
useInterval
是一个自定义挂钩,允许您以指定的时间间隔运行函数。
这对于轮询数据、动画 UI 元素或实现倒数计时器很有用。
import
{ useState, useEffect }
from
'react'
const
useWindowSize = (): {
width
:
number
;
height
:
number
} => {
const
[windowSize, setWindowSize] =
useState
({
width
:
window
.
innerWidth
,
height
:
window
.
innerHeight
,
})
const
handleResize
= (
) => {
setWindowSize
({
width
:
window
.
innerWidth
,
height
:
窗口
。
innerHeight
,
})
}
useEffect
(
() =>
{
window
.
addEventListener
(
'resize'
, handleResize)
return
() =>
window
.
removeEventListener
(
'resize'
, handleResize)
}, [])
return
windowSize
}
useWindowSize
是一个返回当前窗口大小的钩子。
这对于构建需要根据视口大小进行调整的响应式 UI 组件很有用。
import
{ useState, useCallback, useEffect }
from
'react'
const
useCopyToClipboard = (): [
boolean
,
(
text:
string
) =>
void
] => {
const
[isCopied, setIsCopied] =
useState
(
false
)
const
copyToClipboard =
useCallback
(
(
text:
string
)
=>
{
const
el =
document
.createElement
(
'textarea'
)
el.value
=
text
document
.
身体
。
appendChild
(el)
el。
选择
()
文件
。
execCommand
(
'copy'
)
文件
。
身体
。
removeChild
(el)
setIsCopied
(
true
)
}, [])
useEffect
(
() =>
{
if
(isCopied) {
const
timeoutId =
setTimeout
(
() =>
{
setIsCopied
(
false
)
},
2000
)
return
() =>
clearTimeout
(timeoutId)
}
}, [isCopied])
return
[isCopied, copyToClipboard]
}
useCopyToClipboard
是一个自定义挂钩,可简化将文本复制到剪贴板的过程。
它返回一个指示文本是否已被复制的
布尔值
和一个接受要复制的文本的函数。
复制后,它会在 2 秒后自动将布尔值重置为
false
,便于提供用户反馈。
import
{ useRef, useEffect }
from
'react'
const
useEventListener
= (
eventName:
string
,
handler: EventListener,
element: HTMLElement | Window =
window
) => {
const
savedHandler = useRef<
EventListener
>()
useEffect
(
() =>
{
savedHandler .current
= handler
}
,
[handler])
useEffect
(
() =>
{
const
eventListener
= (
event: Event
) => {
if
(savedHandler.current
) {
保存处理程序。
当前
(事件)
}
}
元素。
addEventListener
(eventName, eventListener)
return
() =>
{
元素。
removeEventListener
(eventName, eventListener)
}
}, [eventName, element])
}
useEventListener
是一个通用的钩子,可以简化添加和删除事件侦听器的过程。
它需要一个事件名称、一个处理函数和一个可选元素(默认为
window
)。
此挂钩会在组件安装和卸载时自动处理添加和删除事件侦听器,确保正确清理。
10 个巧妙的 React 钩子,它们可以帮助您编写更高效和可维护的代码。
通过利用这些自定义挂钩,您可以增强您的组件、提高代码的可重用性并创造更好的用户体验。
请记住,钩子是现代 React 的重要组成部分,学习使用和创建自定义钩子将使您成为更熟练的开发人员。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70029166/viewspace-2946881/ ,如需转载,请注明出处,否则将追究法律责任。