コンテンツにスキップ

useStorage

カテゴリ
エクスポートサイズ
1.99 kB
最終変更日
先週
関連リンク

LocalStorage または SessionStorage へアクセス&変更するために使用できるリアクティブな ref を作成します。

デフォルトでは localStorage を使用します。その他のストレージソースは、第 3 引数で指定できます。

デモ

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

使用方法

ヒント

Nuxt 3 で使用する場合、この関数は Nitro の組み込み useStorage() を優先して自動インポートされ**ません**。 VueUse の関数を使用する場合は、明示的にインポートしてください。

js
import { useStorage } from '@vueuse/core'

// bind object
const state = useStorage('my-store', { hello: 'hi', greeting: 'Hello' })

// bind boolean
const flag = useStorage('my-flag', true) // returns Ref<boolean>

// bind number
const count = useStorage('my-count', 0) // returns Ref<number>

// bind string with SessionStorage
const id = useStorage('my-id', 'some-string-id', sessionStorage) // returns Ref<string>

// delete data from storage
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, since the value is not presented in storage

これを解決するには、`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', from storage
console.log(state.value.greeting) // 'hello', from merged default value
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', from storage
console.log(state.value.greeting) // 'hello', from merged default value

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' }

型宣言

型宣言を表示
typescript
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 {
  /**
   * Watch for deep changes
   *
   * @default true
   */
  deep?: boolean
  /**
   * Listen to storage changes, useful for multiple tabs application
   *
   * @default true
   */
  listenToStorageChanges?: boolean
  /**
   * Write the default value to the storage when it does not exist
   *
   * @default true
   */
  writeDefaults?: boolean
  /**
   * Merge the default value with the value read from the storage.
   *
   * When setting it to true, it will perform a **shallow merge** for objects.
   * You can pass a function to perform custom merge (e.g. deep merge), for example:
   *
   * @default false
   */
  mergeDefaults?: boolean | ((storageValue: T, defaults: T) => T)
  /**
   * Custom data serialization
   */
  serializer?: Serializer<T>
  /**
   * On error callback
   *
   * Default log error to `console.error`
   */
  onError?: (error: unknown) => void
  /**
   * Use shallow ref as reference
   *
   * @default false
   */
  shallow?: boolean
  /**
   * Wait for the component to be mounted before reading the storage.
   *
   * @default false
   */
  initOnMounted?: boolean
}
export declare function useStorage(
  key: string,
  defaults: MaybeRefOrGetter<string>,
  storage?: StorageLike,
  options?: UseStorageOptions<string>,
): RemovableRef<string>
export declare function useStorage(
  key: string,
  defaults: MaybeRefOrGetter<boolean>,
  storage?: StorageLike,
  options?: UseStorageOptions<boolean>,
): RemovableRef<boolean>
export declare function useStorage(
  key: string,
  defaults: MaybeRefOrGetter<number>,
  storage?: StorageLike,
  options?: UseStorageOptions<number>,
): RemovableRef<number>
export declare function useStorage<T>(
  key: string,
  defaults: MaybeRefOrGetter<T>,
  storage?: StorageLike,
  options?: UseStorageOptions<T>,
): RemovableRef<T>
export declare function useStorage<T = unknown>(
  key: string,
  defaults: MaybeRefOrGetter<null>,
  storage?: StorageLike,
  options?: UseStorageOptions<T>,
): RemovableRef<T>

ソース

ソースデモドキュメント

貢献者

Anthony Fu
Fernando Fernández
sun0day
Jelf
Jeffrey Li
Anthony Fu
Callum Macrae
Isaac Qadri
Matt Sanders
Doctorwu
Eduardo San Martin Morote
丶远方
Daniel Maixner
chenglu
デビッド・マ
ダニエル・ミッテレーダー
クレマン・オリビエ
ジェームズ・ガーバット
ユーリー・ルデー
プル・ビジェイ
webfansplz
spking11
マウリシ・アバド・グティエレス
ギヨーム・ショー
デニス・ブラジクン
アンドレアス・ウェーバー
レ・ミン・チ
ジェイミー・ウォーバートン
死神
ササン・ファロク
豚の牙
wheat
アレックス・コザック
ヌレッティン・カヤ
パイン
アンテーリオ・ヴィエイラ
イヴァン・デムチュク

変更履歴

v12.0.0-beta.1 2024/11/21
0a9ed - feat!: Vue 2 のサポートを終了し、バンドルを最適化し、クリーンアップしました (#4349)
v11.0.1 2024/08/19
a9b49 - fix: 同じドキュメント内での同期 (#4152)
v11.0.0-beta.2 2024/07/17
5a302 - feat: 使用されているストレージバックエンドに基づいて条件付きでイベントを使用する (#3822)
v10.8.0 2024/02/20
f7ea1 - fix: 値を null に設定すると他のインスタンスに同期されることを確認する (#3737)
a086e - fix: より厳密な型
v10.7.0 2023/12/05
04220 - fix: 未定義のデフォルト値を修正 (#3597)
v10.6.0 2023/11/09
dc6f2 - feat: SSR 用の `waitOnMounted` オプションを追加 (#3504)
b6d2b - fix: デフォルト値がアンラップされない問題を修正 (#3534)
v10.4.0 2023/08/25
6fabe - fix: シリアライズ方法が異なる場合にのみオブジェクトを読み取る (#2782) (#3091)
v10.0.0-beta.5 2023/04/13
cb644 - refactor!: `isFunction` と `isString` ユーティリティを削除
v10.0.0-beta.4 2023/04/13
4d757 - feat(types)!: `MaybeComputedRef` を `MaybeRefOrGetter` に名前変更
0a72b - feat(toValue): `resolveUnref` を `toValue` に名前変更
v9.13.0 2023/02/18
c6185 - fix: カスタムストレージ領域をサポートするためにカスタムイベントを発行する (#2630)
v9.8.2 2022/12/20
800f7 - fix: ページ内で同期、#1595 を閉じる
v9.8.1 2022/12/20
c3851 - fix: 値を設定した後にウォッチを再開し、ループ更新を修正
v9.3.1 2022/10/17
a06b7 - fix: ストレージのクリア時に発生するデータの非同期の問題を修正 (#2221)

MITライセンスでリリースされています。