Skip to content

useStorageAsync

类别
导出体积
1.49 kB
上次更改
last week
相关

支持异步的响应式存储。

用法

基本用法请参考 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
})

类型声明

显示类型声明
ts
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
一纸忘忧
Sam Blowes
Vida Xie
Simon Asika
IlyaL
Fernando Fernández
Alex Liu
Doctorwu
丶远方
Wu Rui
ntnyq
Waldi
Andreas Weber

更新日志

Pending for release...
1d9c4 - fix(docs): typos in useManualRefHistory, useFocusWithin, useStorageAsync, useIntersectionObserver (#5329)
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)