React Query и React Context — две популярные библиотеки для управления состоянием в приложениях React. React Query — это библиотека для извлечения данных, которая позволяет легко извлекать данные из API и сохранять их в браузере. React Context — это способ обмена данными между компонентами в приложении React.

Итак, как React Query и React Context работают вместе?

Один из способов использования React Query и React Context — использовать React Query для извлечения данных из API и последующего сохранения данных в React Context. Это позволяет вам обмениваться данными с любым компонентом, который в них нуждается.

Например, допустим, у вас есть приложение, которое отображает список пользователей. Вы можете использовать React Query для получения списка пользователей из API, а затем сохранить список пользователей в React Context. Любой компонент, которому требуется доступ к списку пользователей, может получить данные из контекста React.

import React, { useContext } from 'react';
import { useQuery } from '@tanstack/react-query';

const UsersContext = React.createContext();

export const UsersProvider = ({ children }) => {
  const [usersQuery, { data, isLoading, error }] = useQuery('users', () => axios.get('/users'));

  return (
    <UsersContext.Provider value={data}>
      {children}
    </UsersContext.Provider>
  );
};

export const useUsers = () => useContext(UsersContext);

const App = () => {
  const users = useUsers();

  if (isLoading) {
    return <div>Loading...</div>;
  } else if (error) {
    return <div>Error fetching users</div>;
  } else {
    return <ul>{users.map((user) => <li key={user.id}>{user.name}</li>)}</ul>;
  }
};

Другой способ использования React Query и React Context — использовать React Query для извлечения данных из API, а затем использовать эти данные для обновления состояния компонента React. Например, допустим, у вас есть компонент, который отображает индикатор загрузки, когда данные извлекаются из API. Вы можете использовать React Query для получения данных, а затем использовать данные для обновления состояния компонента. Когда данные будут получены, индикатор загрузки будет скрыт, а компонент отобразит данные.

import React, { useState, useContext } from 'react';
import { useQuery } from '@tanstack/react-query';

const LoadingIndicator = () => {
  return <div>Loading...</div>;
};

const UsersList = ({ users }) => {
  return (
    <ul>
      {users.map((user) => <li key={user.id}>{user.name}</li>)}
    </ul>
  );
};

const App = () => {
  const [isLoading, setIsLoading] = useState(true);
  const [users, setUsers] = useState([]);

  const usersQuery = useQuery('users', () => axios.get('/users'));

  usersQuery.subscribe(({ data, isLoading }) => {
    setUsers(data);
    setIsLoading(isLoading);
  });

  return (
    <div>
      {isLoading ? <LoadingIndicator /> : <UsersList users={users} />}
    </div>
  );
};

Итак, какую библиотеку следует использовать?

React Query и React Context — мощные библиотеки, но у них есть свои сильные и слабые стороны. React Query лучше справляется с получением данных из API, а React Context лучше справляется с обменом данными между компонентами.

Если вам нужно получить данные из API, React Query — хороший выбор. Если вам нужно обмениваться данными между компонентами, React Context — хороший выбор.

Когда не следует использовать контекст в React

Есть несколько случаев, когда вы не должны использовать контекст в React.

  • Если вам нужно обмениваться данными только между несколькими компонентами, то лучше передавать данные как свойства.
  • Если данные, которыми вы делитесь, большие или сложные, то лучше использовать библиотеку управления состоянием, например Redux.
  • Если вам нужно отслеживать изменения данных, то лучше использовать библиотеку управления состоянием, например Redux.

Заключение

React Query и React Context — мощные библиотеки для управления состоянием в приложениях React. У них разные сильные и слабые стороны, поэтому вы должны выбрать библиотеку, которая подходит для ваших нужд.