Кастомные хранилища, такие как hashStorage, позволяют сохранять и восстанавливать состояние приложения через параметры URL. Вот как это можно реализовать:

  1. Создание hashStorage:
    Создайте хранилище, которое будет работать с хэшем URL. Оно должно реализовывать методы getItemsetItem и removeItem.
// helpers/hashStorage.js
import { StateStorage } from "zustand/middleware";
 
const hashStorage = {
  getItem: (name) => {
    const searchParams = new URLSearchParams(window.location.hash.slice(1));
    const value = searchParams.get(name);
    return value ?? null;
  },
  setItem: (name, value) => {
    const searchParams = new URLSearchParams(window.location.hash.slice(1));
    searchParams.set(name, value);
    window.location.hash = searchParams.toString();
  },
  removeItem: (name) => {
    const searchParams = new URLSearchParams(window.location.hash.slice(1));
    searchParams.delete(name);
    window.location.hash = searchParams.toString();
  },
};
 
export default hashStorage;
  1. Настройка Middleware Persist:
    Подключите persist middleware в Zustand Store и используйте hashStorage для сохранения состояния.
// stores/SearchStore.js
import { create } from "zustand";
import { persist } from "zustand/middleware";
import hashStorage from "../helpers/hashStorage";
 
const useSearchStore = create(
  persist(
    (set) => ({
      searchText: "",
      setText: (text) => set({ searchText: text }),
    }),
    {
      name: "search-storage",
      getStorage: () => hashStorage,
    },
  ),
);
 
export default useSearchStore;
  1. Использование в компоненте:
    В компоненте можно инициализировать состояние из URL и обновлять его при изменении.
import { useEffect } from "react";
import useSearchStore from "./stores/SearchStore";
 
const SearchComponent = () => {
  const { searchText, setText } = useSearchStore();
 
  useEffect(() => {
    const initialSearchText =
      new URLSearchParams(window.location.hash.slice(1)).get("searchText") ||
      "";
    setText(initialSearchText);
  }, [setText]);
 
  return (
    <div>
      <input
        type="text"
        value={searchText}
        onChange={(e) => setText(e.target.value)}
        placeholder="Поиск..."
      />
      <p>Текущий поиск: {searchText}</p>
    </div>
  );
};
  1. Другие типы хранилищ:
    Аналогично можно создать хранилище для sessionStorage или localStorage.
// helpers/sessionStorage.js
const sessionStorage = {
  getItem: (name) => sessionStorage.getItem(name),
  setItem: (name, value) => sessionStorage.setItem(name, value),
  removeItem: (name) => sessionStorage.removeItem(name),
};
 
export default sessionStorage;

Основные моменты:

  • hashStorage позволяет сохранять состояние в хэше URL.
  • persist middleware используется для сохранения и восстановления состояния.
  • Инициализация состояния из URL при монтировании компонента.
  • Обновление URL при изменении состояния.

Таким образом, кастомные хранилища позволяют гибко управлять состоянием приложения и синхронизировать его с URL.


Назад