⏸️ 可暂停(Pausable)

使用像 useIntervalFnuseMouse 之类 Hook 使得管理不同的功能变得更加简单和动态。

然而,由于这些 Hook 的触发频率相对较高,可能导致意外的性能开销,因此增加一种暂停和恢复这些 Hook 的方式可以带给开发者更多的控制权,以避免不必要的更新,从而改善用户体验。

基于这样的考虑,我们引入了 Pausable 实例。

Pausable 实例

Pausable 旨在封装暂停和恢复功能的能力,并提供对当前活动状态的访问,而不直接触发组件重渲染。这种方法保持了原始预期的行为,同时提供了额外的控制。

一个 Pausable 实例定义如下:

export type Pausable<PauseArgs extends unknown[] = [], ResumeArgs extends unknown[] = []> = { /** * 实例是否处于活跃状态,它只是一个 Ref Getter */ isActive(): boolean /** * 暂停实例 * * @params update - 是否触发重渲染 */ pause: (...args: [update?: boolean, ...PauseArgs]) => void /** * 恢复实例 * * @params update - 是否触发重渲染 */ resume: (...args: [update?: boolean, ...ResumeArgs]) => void }

usePausable

usePausable Hook 帮助创建可暂停的实例。它在底层使用 useGetterRef 来提供 isActive 属性的 getter。

const pausable = usePausable(initialIsActive, pauseCallback, resumeCallback)

在许多内部 Hook 中,usePausable 被用来创建一个 Pausable 实例,然后不同的 Hooks 可以根据自身需求,自定义暂停和恢复的功能逻辑。

示例使用

下面是一个简单的示例,展示了如何使用 Pausable 实例:

import { usePausable } from '@shined/react-use' function App() { // pausable 可以从某些 Hooks 的返回里拿到 // const { isActive, pause, resume, ...others } = useMouse() const { isActive, pause, resume } = usePausable(false) function check() { if (isActive()) { // Do something } } return ( <div> <button onClick={() => pausable.pause()}>Pause</button> <button onClick={() => pausable.resume()}>Resume</button> <button onClick={check}>Check</button> </div> ) }