useVersionedAction

这个 Hook 自 v1.7.0 版本起可用。

一个用于帮助使用“带版本”动作的 React Hook,常用于异步场景下进行操作过滤,以保证只执行最新的操作。

场景

  • 异步操作过滤:处理多个异步操作,只执行最新的操作,忽略“已过期”的操作。

演示

快速点击下面的两个按钮,只有“带版本”的操作会忽略“已过期”的操作,确保只执行最新的操作。

源码
Value:
Click to Fetch

用法

doSomething() 被连续调用时,只有最新的操作会被执行,而不会出现“过期”的操作导致的「屏闪」或者「非预期结果」。

const [incVersion, runVersionedAction] = useVersionedAction()

const doSomething = async () => {
  // 通过 incVersion() 来增加版本号
  const version = incVersion()

  // 异步操作,如请求数据
  const result = await fetchSomething()

  // 通过 runVersionedAction() 来确保只执行最新的操作
  runVersionedAction(version, async () => {
    setResult(result)
  })
}

源码

点击下方链接跳转 GitHub 查看源代码。

API

const [incVersion, runVersionedAction] = useVersionedAction()

返回值

export type UseVersionedActionReturns = readonly [
  /**
   * 增加版本号,并返回当前版本号
   */
  incVersion: () => number,
  /**
   * 执行带版本号的操作,只有当版本号匹配时才会执行,以确保只执行最新的操作
   */
  runVersionedAction: <T extends AnyFunc>(version: number, handler: T) => ReturnType<T> | undefined,
]