Как наилучшим образом организовать запросы с использованием React-Query?

Как можно организовать работу с запросами в React-Query в Zustand, чтобы иметь общий объект-хранилище запросов, а не записывать их непосредственно в компонентах?
  • 25 июня 2024 г. 19:51
Ответы на вопрос 2
Для наилучшей организации запросов с использованием React-Query, рекомендуется создать отдельный модуль для работы с запросами, который будет содержать все необходимые запросы и логику их обработки.

Пример организации запросов с использованием React-Query:

1. Создайте файл `api.js`, где будут храниться все запросы:

```javascript
import { useQuery } from 'react-query';

export const fetchUsers = async () => {
  const response = await fetch('https://api.example.com/users');
  if (!response.ok) {
    throw new Error('Network response was not ok');
  }
  return response.json();
};

export const useUsers = () => {
  return useQuery('users', fetchUsers);
};
```

2. В компоненте, где нужно использовать запросы, импортируйте функцию `useUsers` и вызовите её:

```javascript
import { useUsers } from './api';

const UsersList = () => {
  const { data, isLoading, isError } = useUsers();

  if (isLoading) return <p>Loading...</p>;
  if (isError) return <p>Error fetching data</p>;

  return (
    <div>
      <h1>Users</h1>
      <ul>
        {data.map(user => (
          <li key={user.id}>{user.name}</li>
        ))}
      </ul>
    </div>
  );
};
```

Чтобы организовать работу с запросами в React-Query в Zustand, можно создать общий объект-хранилище запросов, который будет хранить все функции для работы с запросами:

```javascript
import { create } from 'zustand';
import { useQuery } from 'react-query';

const useRequestStore = create((set) => ({
  getUsers: () => {
    return useQuery('users', fetchUsers);
  },
}));

export default useRequestStore;
```

Теперь можно использовать этот объект-хранилище запросов в любом компоненте:

```javascript
import useRequestStore from './useRequestStore';

const UsersList = () => {
  const getUsers = useRequestStore(state => state.getUsers);
  const { data, isLoading, isError } = getUsers();

  if (isLoading) return <p>Loading...</p>;
  if (isError) return <p>Error fetching data</p>;

  return (
    <div>
      <h1>Users</h1>
      <ul>
        {data.map(user => (
          <li key={user.id}>{user.name}</li>
        ))}
      </ul>
    </div>
  );
};
```

Таким образом, запросы будут организованы в отдельном модуле и будут доступны для использования в любом компоненте, что делает код более структурированным и удобным для разработки.
Поработав какое-то время с React Query могу выделить следующие моменты: 
1. Не стоит пытаться объявлять все query за один раз - они "подвисают" в приложении и не используются. Это можно увидеть в React Query Devtools.
2. Можете вынести сами запросы в функци на отдельный слой/уровень/файл, и уже в useQuery в queryFn и в useMutation в mutationFn использовать функции.
3. Сложную бизнес-логику можно смело убрать под хук, в котором будете вызывать, обрабатывать и возвращать данные из useQuery/useMutation'а.
4. React Query - библиотека не для работы с запросами, это, по сути, ещё одно хранилище, которое просто хранит результаты Promise-операций.
Похожие вопросы