Skip to content

computedAsync

Category
Export Size
358 B
Last Changed
15 minutes ago
Alias
asyncComputed

用于异步函数的计算属性

用法

js
import { computedAsync } from '@vueuse/core'
import { ref } from 'vue'

const name = ref('jack')

const userInfo = computedAsync(
  async () => {
    return await mockLookUp(name.value)
  },
  null, // 初始状态
)

Evaluation 参数

您需要传递一个 ref 来跟踪异步函数的状态。

js
import { computedAsync } from '@vueuse/core'
import { ref } from 'vue'

const evaluating = ref(false)

const userInfo = computedAsync(
  async () => { /* 你的逻辑 */ },
  null,
  evaluating,
)

onCancel

当计算源在前一个异步函数解决之前发生变化时,您可能希望取消前一个函数。以下是如何与 fetch API 结合使用的示例。

js
const packageName = ref('@vueuse/core')

const downloads = computedAsync(async (onCancel) => {
  const abortController = new AbortController()

  onCancel(() => abortController.abort())

  return await fetch(
    `https://api.npmjs.org/downloads/point/last-week/${packageName.value}`,
    { signal: abortController.signal },
  )
    .then(response => response.ok ? response.json() : { downloads: '' })
    .then(result => result.downloads)
}, 0)

懒加载

默认情况下,computedAsync 在创建时立即开始解析,指定 lazy: true 可以使其在第一次访问时开始解析。

js
import { computedAsync } from '@vueuse/core'
import { ref } from 'vue'

const evaluating = ref(false)

const userInfo = computedAsync(
  async () => { /* 你的逻辑 */ },
  null,
  { lazy: true, evaluating },
)

注意事项

  • 与 Vue 内置的 computed 函数相反,computedAsync 进行了依赖跟踪,并且在依赖项更改时自动重新评估。但请注意,只有在第一个调用堆栈中引用的依赖项才会考虑这一点。换句话说:异步访问的依赖项不会触发异步计算值的重新评估。

  • 与 Vue 内置的 computed 函数相反,无论其结果当前是否被跟踪,异步计算值的重新评估都会在依赖项发生更改时触发。

类型声明

显示类型声明
typescript
/**
 * 清除计算属性的副作用
 *
 * @param cancelCallback 当触发计算值的重新计算时,调用提供的回调函数
 */
export type AsyncComputedOnCancel = (cancelCallback: Fn) => void
export interface AsyncComputedOptions {
  /**
   * 是否应该延迟评估值
   *
   * @default false
   */
  lazy?: boolean
  /**
   * 传递的 Ref 以接收异步评估的更新
   */
  evaluating?: Ref<boolean>
  /**
   * 使用 shallowRef
   *
   * @default true
   */
  shallow?: boolean
  /**
   * 捕获到错误时的回调函数。
   */
  onError?: (e: unknown) => void
}
/**
 * 创建一个计算属性,其值是通过异步回调函数生成的。
 *
 * @see https://vueuse.org/computedAsync
 * @param evaluationCallback     生成计算值的返回 Promise 的回调函数
 * @param initialState           初始状态,在第一次执行完成之前使用
 * @param optionsOrRef           额外选项或传递的 Ref 以接收异步状态的更新
 */
export declare function computedAsync<T>(
  evaluationCallback: (onCancel: AsyncComputedOnCancel) => T | Promise<T>,
  initialState: T,
  optionsOrRef?: Ref<boolean> | AsyncComputedOptions,
): Ref<T>
export declare function computedAsync<T>(
  evaluationCallback: (onCancel: AsyncComputedOnCancel) => T | Promise<T>,
  initialState?: undefined,
  optionsOrRef?: Ref<boolean> | AsyncComputedOptions,
): Ref<T | undefined>
export { computedAsync as asyncComputed }

Source

SourceDocs

贡献者

Anthony Fu
丶远方
xiankaiqun
Anthony Fu
Fernando Fernández
Icey Wu
sun0day
Yugang Cao
Bodo Graumann

变更日志

v11.1.0 on 9/16/2024
45b18 - fix: type signature (#4207)
v10.0.0-beta.0 on 3/14/2023
23c9d - feat!: set shallow defalut to true (#2621)
v9.11.0 on 1/17/2023
a0656 - feat: introduce shadow option (#2616)

Released under the MIT License.