Skip to content

useStorageAsync

类别
导出体积
1.47 kB
上次更改
2 months 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
})

类型声明

显示类型声明
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
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)