Skip to content

useStorage

类别
导出体积
2 kB
上次更改
1 hour ago
相关

创建一个响应式引用,用于访问和修改 LocalStorageSessionStorage

默认情况下使用 localStorage,其他存储源可以通过第三个参数指定。

示例

name: Banana
color: Yellow
size: Medium
count: 0

用法

TIP

在使用 Nuxt 3 时,此函数将不会自动导入,而是使用 Nitro 内置的 useStorage()。如果要从 VueUse 使用该函数,请显式导入。

ts
import { 
useStorage
} from '@vueuse/core'
// 绑定对象 const
state
=
useStorage
('my-store', {
hello
: 'hi',
greeting
: 'Hello' })
// 绑定布尔值 const
flag
=
useStorage
('my-flag', true) // 返回 Ref<boolean>
// 绑定数字 const
count
=
useStorage
('my-count', 0) // 返回 Ref<number>
// 使用 SessionStorage 绑定字符串 const
id
=
useStorage
('my-id', 'some-string-id',
sessionStorage
) // 返回 Ref<string>
// 从存储中删除数据
state
.
value
= null

合并默认值

默认情况下,useStorage 将使用存储中的值 (如果存在) 并忽略默认值。请注意,当你向默认值添加更多属性时,如果客户端的存储中没有该键,则该键可能是 undefined

ts
localStorage
.
setItem
('my-store', '{"hello": "hello"}')
const
state
=
useStorage
('my-store', {
hello
: 'hi',
greeting
: 'hello' },
localStorage
)
console
.
log
(
state
.
value
.
greeting
) // undefined,因为存储中没有该值

为了解决这个问题,你可以启用 mergeDefaults 选项。

ts
localStorage
.
setItem
('my-store', '{"hello": "nihao"}')
const
state
=
useStorage
(
'my-store', {
hello
: 'hi',
greeting
: 'hello' },
localStorage
,
{
mergeDefaults
: true } // <--
)
console
.
log
(
state
.
value
.
hello
) // 'nihao',来自存储
console
.
log
(
state
.
value
.
greeting
) // 'hello',来自合并的默认值
js
localStorage.setItem('my-store', '{"hello": "nihao"}')
const state = useStorage(
  'my-store',
  { hello: 'hi', greeting: 'hello' },
  localStorage,
  { mergeDefaults: true },
)
console.log(state.value.hello) // 'nihao',来自存储
console.log(state.value.greeting) // 'hello',来自合并的默认值

当设置为 true 时,它将对对象执行浅合并。你可以传递一个函数来执行自定义合并 (例如,深合并),例如:

ts
const 
state
=
useStorage
(
'my-store', {
hello
: 'hi',
greeting
: 'hello' },
localStorage
,
{
mergeDefaults
: (
storageValue
,
defaults
) => deepMerge(
defaults
,
storageValue
) } // <--
)
js
const state = useStorage(
  'my-store',
  { hello: 'hi', greeting: 'hello' },
  localStorage,
  {
    mergeDefaults: (storageValue, defaults) =>
      deepMerge(defaults, storageValue),
  },
)

自定义序列化

默认情况下,useStorage 将根据提供的默认值的数据类型智能地使用相应的序列化程序。例如,对于对象,将使用 JSON.stringify / JSON.parse,对于数字,将使用 Number.toString / parseFloat,等等。

你也可以为 useStorage 提供自己的序列化函数:

ts
import { 
useStorage
} from '@vueuse/core'
useStorage
(
'key', {},
undefined
,
{
serializer
: {
read
: (
v
: any) =>
v
?
JSON
.
parse
(
v
) : null,
write
: (
v
: any) =>
JSON
.
stringify
(
v
),
}, }, )
js
import { useStorage } from '@vueuse/core'
useStorage('key', {}, undefined, {
  serializer: {
    read: (v) => (v ? JSON.parse(v) : null),
    write: (v) => JSON.stringify(v),
  },
})

请注意,当你提供 null 作为默认值时,useStorage 无法从中推断出数据类型。在这种情况下,你可以提供自定义序列化程序或显式重用内置的序列化程序。

ts
import { 
StorageSerializers
,
useStorage
} from '@vueuse/core'
const
objectLike
=
useStorage
('key', null,
undefined
, {
serializer
:
StorageSerializers
.
object
})
objectLike
.
value
= {
foo
: 'bar' }

类型声明

显示类型声明
ts
export interface 
Serializer
<
T
> {
read
: (
raw
: string) =>
T
write
: (
value
:
T
) => string
} export interface
SerializerAsync
<
T
> {
read
: (
raw
: string) =>
Awaitable
<
T
>
write
: (
value
:
T
) =>
Awaitable
<string>
} export declare const
StorageSerializers
:
Record
<
"boolean" | "object" | "number" | "any" | "string" | "map" | "set" | "date",
Serializer
<any>
> export declare const
customStorageEventName
= "vueuse-storage"
export interface StorageEventLike {
storageArea
:
StorageLike
| null
key
: StorageEvent["key"]
oldValue
: StorageEvent["oldValue"]
newValue
: StorageEvent["newValue"]
} export interface
UseStorageOptions
<
T
>
extends ConfigurableEventFilter, ConfigurableWindow, ConfigurableFlush { /** * 监听深层次的变化 * * @default true */
deep
?: boolean
/** * 监听存储变化,适用于多标签页应用程序 * * @default true */
listenToStorageChanges
?: boolean
/** * 当存储中不存在时,将默认值写入存储 * * @default true */
writeDefaults
?: boolean
/** * 将默认值与从存储中读取的值合并。 * * 当设置为 true 时,它将对对象执行 **浅层合并**。 * 你可以传递一个函数来执行自定义合并(例如,深层合并),例如: * * @default false */
mergeDefaults
?: boolean | ((
storageValue
:
T
,
defaults
:
T
) =>
T
)
/** * 自定义数据序列化 */
serializer
?:
Serializer
<
T
>
/** * 错误回调 * * 默认将错误记录到 `console.error` */
onError
?: (
error
: unknown) => void
/** * 将浅层 ref 用作引用 * * @default false */
shallow
?: boolean
/** * 在组件挂载后再读取存储 * * @default false */
initOnMounted
?: boolean
} export declare function
useStorage
(
key
:
MaybeRefOrGetter
<string>,
defaults
:
MaybeRefOrGetter
<string>,
storage
?:
StorageLike
,
options
?:
UseStorageOptions
<string>,
):
RemovableRef
<string>
export declare function
useStorage
(
key
:
MaybeRefOrGetter
<string>,
defaults
:
MaybeRefOrGetter
<boolean>,
storage
?:
StorageLike
,
options
?:
UseStorageOptions
<boolean>,
):
RemovableRef
<boolean>
export declare function
useStorage
(
key
:
MaybeRefOrGetter
<string>,
defaults
:
MaybeRefOrGetter
<number>,
storage
?:
StorageLike
,
options
?:
UseStorageOptions
<number>,
):
RemovableRef
<number>
export declare function
useStorage
<
T
>(
key
:
MaybeRefOrGetter
<string>,
defaults
:
MaybeRefOrGetter
<
T
>,
storage
?:
StorageLike
,
options
?:
UseStorageOptions
<
T
>,
):
RemovableRef
<
T
>
export declare function
useStorage
<
T
= unknown>(
key
:
MaybeRefOrGetter
<string>,
defaults
:
MaybeRefOrGetter
<null>,
storage
?:
StorageLike
,
options
?:
UseStorageOptions
<
T
>,
):
RemovableRef
<
T
>

源码

源码演示文档

贡献者

一纸忘忧

更新日志

没有最近的更新日志