Использование Immer middleware в Zustand преследует цель упрощения работы с неизменяемыми состояниями.
Преимущества использования Immer:
- Упрощение работы с неизменяемыми состояниями: Immer позволяет работать с состоянием как с изменяемым, автоматически создавая новые версии состояния.
- Уменьшение ошибок: Меньше вероятность ошибок, связанных с неправильным обновлением состояния.
- Улучшение читаемости кода: Код становится более читаемым и понятным.
1. Создание Immer middleware:
// middleware/immerMiddleware.ts
import produce from 'immer';
const immerMiddleware = (config) => (set, get, api) =>
config((fn) => set(produce(fn)), get, api);
export default immerMiddleware;
2. Использование Immer middleware в Zustand Store:
// store.ts
import create from 'zustand';
import immerMiddleware from './middleware/immerMiddleware';
type CoffeeState = {
coffeeList: any[];
addCoffee: (coffee: any) => void;
removeCoffee: (id: number) => void;
};
const useCoffeeStore = create<CoffeeState>(immerMiddleware((set) => ({
coffeeList: [],
addCoffee: (coffee) => set((state) => {
state.coffeeList.push(coffee);
}),
removeCoffee: (id) => set((state) => {
state.coffeeList = state.coffeeList.filter((coffee) => coffee.id !== id);
}),
})));
export default useCoffeeStore;
3. Использование Store в компонентах:
// components/CoffeeList.tsx
import React from 'react';
import useCoffeeStore from '../store';
const CoffeeList = () => {
const { coffeeList, removeCoffee } = useCoffeeStore();
return (
<ul>
{coffeeList.map((coffee) => (
<li key={coffee.id}>
{coffee.name}
<button onClick={() => removeCoffee(coffee.id)}>Удалить</button>
</li>
))}
</ul>
);
};
export default CoffeeList;
4. Добавление кофе:
// components/AddCoffeeForm.tsx
import React, { useState } from 'react';
import useCoffeeStore from '../store';
const AddCoffeeForm = () => {
const [name, setName] = useState('');
const { addCoffee } = useCoffeeStore();
const handleSubmit = (e) => {
e.preventDefault();
addCoffee({ id: Date.now(), name });
setName('');
};
return (
<form onSubmit={handleSubmit}>
<input
type="text"
value={name}
onChange={(e) => setName(e.target.value)}
placeholder="Название кофе"
/>
<button type="submit">Добавить</button>
</form>
);
};
export default AddCoffeeForm;
Основные моменты:
- Установка зависимостей: Установка
immer
иzustand
. - Создание Immer middleware: Создание middleware для использования Immer в Zustand.
- Использование Immer middleware в Store: Применение middleware при создании Store.
- Работа с неизменяемыми состояниями: Использование Immer для упрощения работы с состоянием.
- Использование Store в компонентах: Добавление и удаление кофе с использованием Store.