Skip to content

React

Точка входа /react экспортирует хук useStorage(), построенный на том же фреймворк-агностичном движке, что и Vue composable — те же опции (TTL, миграции, encrypt, compress, sign, sync, debounce/throttle, history, evictOnQuota), то же поведение. Он построен на React useSyncExternalStore, так что безопасен при конкурентном рендеринге.

tsx
import { useStorage } from 'vue-storage-kit/react'

function Counter() {
  const {
    value: count,
    setValue: setCount,
    isReady,
  } = useStorage('count', {
    defaultValue: 0,
    target: 'local',
  })

  if (!isReady) return <p>Loading…</p>

  return <button onClick={() => setCount((c) => c + 1)}>Clicked {count} times</button>
}

Отличия от Vue composable

VueReact
Возвращает{ value: Ref<T>, ... } — присвойте value.value = x для записи{ value: T, setValue, ... } — вызовите setValue(x) или setValue(prev => next) для записи
Общий экземплярДва Vue-компонента с одним key+target делят один RefДва React-компонента с одним key+target делят один и тот же движок (через useSyncExternalStore), но каждый получает свой снапшот
Реакция на изменившийся keyНе поддерживается — как и на стороне VueНе поддерживается. Смонтируйте новый экземпляр компонента для другого ключа (например, через проп key) — тот же паттерн, что React уже рекомендует для «сбросить это состояние»

Два Vue-компонента, два React-компонента или их смесь, вызывающие useStorage() с одним key+target, все делят один движок — один набор таймеров, один вызов адаптера на запись, один конвейер TTL/миграций/синхронизации — независимо от того, какой фреймворк(и) их создал.

Пока недоступно для React (пока только для Vue — см. todo.md проекта для отслеживаемого бэклога): useCookie, useIndexedDB/useIDBRef, useStorageList, useStorageKeys, useBroadcastChannel и эквивалент Pinia-persist.

react (^18.0.0, для useSyncExternalStore) — опциональная peer-зависимость, нужна только при импорте vue-storage-kit/react.