⏸️ 可暂停(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>
  )
}