Skip to content

useStorageAsync

类别
导出体积
1.47 kB
上次更改
4 minutes ago
相关

具有异步支持的响应式 Storage。

用法

基本用法请参考 useStorage

等待首次加载

当用户进入你的应用时,useStorageAsync() 会开始从异步存储加载值, 有时你可能会先得到默认初始值,而非存储中真实的值。

ts
import { useStorageAsync } from '@vueuse/core'

const accessToken = useStorageAsync('access.token', '', SomeAsyncStorage)

// 在异步存储准备好之前,accessToken.value 可能为空
console.log(accessToken.value) // ""

setTimeout(() => {
  // 一段时间后,异步存储准备好
  console.log(accessToken.value) // "存储中真实的值"
}, 500)

在这种情况下,你可以等待存储准备好,返回的值也是一个 Promise, 因此你可以在模板或脚本中等待它的解析。

ts
// 如果环境支持,可使用顶层 await
const accessToken = await useStorageAsync('access.token', '', SomeAsyncStorage)

console.log(accessToken.value) // "存储中真实的值"

如果必须等待多个存储,放入 Promise.allSettled() 中:

ts
router.onReady(async () => {
  await Promise.allSettled([
    accessToken,
    refreshToken,
    userData,
  ])

  app.mount('app')
})

选项中有一个名为 onReady 的回调:

ts
import { useStorageAsync } from '@vueuse/core'

// 使用 ES2024 Promise.withResolvers,你也可以使用任何 Deferred 对象或事件总线来实现相同功能。
const { promise, resolve } = Promise.withResolvers()

const accessToken = useStorageAsync('access.token', '', SomeAsyncStorage, {
  onReady(value) {
    resolve(value)
  }
})

// 在 main.ts 中
router.onReady(async () => {
  // 等待 accessToken 加载完成
  await promise

  // 现在 accessToken 已经加载完成,可以安全挂载应用

  app.mount('app')
})

也可以直接将 resolve 作为回调使用:

ts
const accessToken = useStorageAsync('access.token', '', SomeAsyncStorage, {
  onReady: resolve
})

类型声明

显示类型声明
typescript
export interface UseStorageAsyncOptions<T>
  extends Omit<UseStorageOptions<T>, "serializer"> {
  /**
   * 自定义数据序列化
   */
  serializer?: SerializerAsync<T>
  /**
   * On first value loaded hook.
   */
  onReady?: (value: T) => void
}
export declare function useStorageAsync(
  key: string,
  initialValue: MaybeRefOrGetter<string>,
  storage?: StorageLikeAsync,
  options?: UseStorageAsyncOptions<string>,
): RemovableRef<string> & Promise<RemovableRef<string>>
export declare function useStorageAsync(
  key: string,
  initialValue: MaybeRefOrGetter<boolean>,
  storage?: StorageLikeAsync,
  options?: UseStorageAsyncOptions<boolean>,
): RemovableRef<boolean> & Promise<RemovableRef<boolean>>
export declare function useStorageAsync(
  key: string,
  initialValue: MaybeRefOrGetter<number>,
  storage?: StorageLikeAsync,
  options?: UseStorageAsyncOptions<number>,
): RemovableRef<number> & Promise<RemovableRef<number>>
export declare function useStorageAsync<T>(
  key: string,
  initialValue: MaybeRefOrGetter<T>,
  storage?: StorageLikeAsync,
  options?: UseStorageAsyncOptions<T>,
): RemovableRef<T> & Promise<RemovableRef<T>>
export declare function useStorageAsync<T = unknown>(
  key: string,
  initialValue: MaybeRefOrGetter<null>,
  storage?: StorageLikeAsync,
  options?: UseStorageAsyncOptions<T>,
): RemovableRef<T> & Promise<RemovableRef<T>>

源码

源码文档

贡献者

Anthony Fu
一纸忘忧
Anthony Fu
Jelf
Simon Asika
IlyaL
Fernando Fernández
Alex Liu
Doctorwu
丶远方
Wu Rui
ntnyq
Waldi
Andreas Weber

更新日志

3a2df - feat: add onReady option and Promise return (#4158)
7432f - feat(types): deprecate MaybeRef and MaybeRefOrGetter in favor of Vue's native (#4636)
dd316 - feat: use passive event handlers everywhere is possible (#4477)
e6a17 - fix: correct initialization when initialValue is getter (#4452)
59f75 - feat(toValue): deprecate toValue from @vueuse/shared in favor of Vue's native
0a9ed - feat!: drop Vue 2 support, optimize bundles and clean up (#4349)
c197e - fix: correct ssr handler (#3703)
cb644 - refactor!: remove isFunction and isString utils