Кастомные хранилища, такие как hashStorage
, позволяют сохранять и восстанавливать состояние приложения через параметры URL. Вот как это можно реализовать:
- Создание
hashStorage
:
Создайте хранилище, которое будет работать с хэшем URL. Оно должно реализовывать методыgetItem
,setItem
и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;
- Настройка 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;
- Использование в компоненте:
В компоненте можно инициализировать состояние из 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>
);
};
- Другие типы хранилищ:
Аналогично можно создать хранилище для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.