首页 前端知识 VueUse使用之useStorage

VueUse使用之useStorage

2024-07-08 09:07:21 前端知识 前端哥 384 471 我要收藏

useStorage
响应式 Localstorage/SessionStorage

使用

import { useStorage } from '@vueuse/core'
// bind
const state = useStorage('my-store', { hello: 'hi', greeting: 'Hello' })
// bind string with SessionStorage
const id = useStorage('my-id', 'some-string-id', sessionStorage) // returns Ref<string>
// delete data from storage
state.value = null

合并默认值
默认情况下,如果useStorage显示并忽略默认值,它将使用存储中的值。请注意,当您向默认值添加更多属性时,如果客户端的存储没有这个key,则该key可能是undefined

localStorage.setItem('my-store', '{"hello": "hello"}')
const state = useStorage('my-store', { hello: 'hi', greeting: 'hello' }, localStorage)
console.log(state.greeting) // undefined, since the value is not presented in storage

解决办法:

localStorage.setItem('my-store', '{"hello": "nihao"}')

const state = useStorage(
  'my-store',
  { hello: 'hi', greeting: 'hello' },
  localStorage,
  { mergeDefaults: true } // <--
)
console.log(state.hello) // 'nihao', from storage
console.log(state.greeting) // 'hello', from merged default value

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

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使用自定义序列化

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

请注意,当您提供null作为默认值时,useStorage不能从它中假定数据类型。在这种情况下,您可以提供自定义序列化程序明确内置的类型。

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

报错
组件外使用存储:在js文件中使用useStorage可能会报错:getActivePinia()“ was called but there was no active Pinia. Did you forget to install pinia,原因是:
在幕后,useStore() injects 你给你的app 的pinia 实例。 这意味着如果 pinia 实例无法自动注入,您必须手动将其提供给 useStore() 函数。
重点!!!pinia解决方案在这里插入图片描述在这里插入图片描述

转载请注明出处或者链接地址:https://www.qianduange.cn//article/13878.html
标签
评论
发布的文章

html左右两栏布局实现

2024-08-04 00:08:50

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!