Интеграция Tanstack Query (React Query) и Zustand предназначена для эффективного управления запросами к API и состоянием приложения в React-приложении.
Преимущества совместного использования:
- Tanstack Query: Управление запросами к API, кеширование, повторные запросы, пагинация.
- Zustand: Управление локальным состоянием приложения, упрощение работы с состоянием.
1. Настройка QueryClientProvider:
// index.tsx
import React from 'react';
import ReactDOM from 'react-dom';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { create } from 'zustand';
import App from './App';
const queryClient = new QueryClient();
ReactDOM.render(
<QueryClientProvider client={queryClient}>
<App />
</QueryClientProvider>,
document.getElementById('root')
);
2. Создание Zustand Store:
// store.ts
import create from 'zustand';
type CoffeeState = {
coffeeList: any[];
setCoffeeList: (list: any[]) => void;
};
const useCoffeeStore = create<CoffeeState>((set) => ({
coffeeList: [],
setCoffeeList: (list) => set({ coffeeList: list }),
}));
export default useCoffeeStore;
3. Использование Tanstack Query и Zustand в компонентах:
// components/CoffeeList.tsx
import React from 'react';
import { useQuery } from '@tanstack/react-query';
import useCoffeeStore from '../store';
const fetchCoffeeList = async () => {
const response = await fetch('https://api.example.com/coffee');
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
};
const CoffeeList = () => {
const { data, error, isLoading } = useQuery(['coffeeList'], fetchCoffeeList);
const { setCoffeeList } = useCoffeeStore();
React.useEffect(() => {
if (data) {
setCoffeeList(data);
}
}, [data, setCoffeeList]);
if (isLoading) return <div>Загрузка...</div>;
if (error) return <div>Ошибка: {error.message}</div>;
return (
<ul>
{data.map((coffee) => (
<li key={coffee.id}>{coffee.name}</li>
))}
</ul>
);
};
export default CoffeeList;
4. Работа с мутациями и обновлением состояния:
// components/AddCoffeeForm.tsx
import React, { useState } from 'react';
import { useMutation, useQueryClient } from '@tanstack/react-query';
import useCoffeeStore from '../store';
const addCoffee = async (newCoffee) => {
const response = await fetch('https://api.example.com/coffee', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(newCoffee),
});
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
};
const AddCoffeeForm = () => {
const queryClient = useQueryClient();
const [name, setName] = useState('');
const { coffeeList, setCoffeeList } = useCoffeeStore();
const mutation = useMutation(addCoffee, {
onSuccess: (newCoffee) => {
queryClient.invalidateQueries(['coffeeList']);
setCoffeeList([...coffeeList, newCoffee]);
},
});
const handleSubmit = (e) => {
e.preventDefault();
mutation.mutate({ 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;
Основные моменты:
- Установка зависимостей: Установка
@tanstack/react-query
иzustand
. - Настройка QueryClientProvider: Обертка приложения в
QueryClientProvider
. - Создание Zustand Store: Создание хранилища для управления состоянием.
- Использование Tanstack Query и Zustand: Интеграция запросов и состояния в компонентах.
- Работа с мутациями: Обновление состояния и инвалидация кеша при мутациях.
Совместное использование Tanstack Query и Zustand позволяет эффективно управлять запросами к API и состоянием приложения, улучшая производительность и упрощая код.