Pull to refresh

Comments 21

Зачем мне React Query, когда есть RTK Query?

вы правы, но RTK нет смысла использовать без связки с Redux и в целом очень похожий функционал

Спасибо за пример, и небольшое пояснение.

Смотря на то, какой именно код вы используете в своём примере, сугубо по моему личному мнению, есть подозрение, что данный пример сильно "притянут за уши". И, на основе личного опыта, есть вопрос: а почему нельзя использовать useEffect на каждое из состояний в отдельности?

Пояснение вопроса: у нас есть несколько состояний нашего условного компонента, и каждое состояние, по написанной логике, отвечает за определенное поведение компонента, и мне не очень понятно, почему по одному изменению пропса должны меняться все состояния в совокупности разом, если каждое из данных состояний должно порождать то или иное дальнейшее поведение. То есть: category -> порождает обновление ссылки -> ссылка порождает fetch -> результат ответа (response / catch) на запрос порождает изменение либо data с обнулением error, либо error с обнулением data -> наличие которых уже порождает изменение isLoading, что в свою очередь позволяет держать актуальные состояния и ошибки в текущем моменте, а не держать их из "прошлого".

Да, можно добиться того же результата без библиотеки, но это гораздо больше кода, поэтому я привела преимущества. Спасибо за развёрнутый ответ.

Глядя в эти примеры, прихожу к выводу, что тут скорее напрашивается кастомный хук, нежели сторонняя библиотека.

эта статья для того чтобы вам захотелось попробовать React Query, внутри библиотеки ещё много крутых и полезных функций

Будет здорово, если будет продолжение с более продвинутыми примерами :)

Можете пожалуйста подсказать как закодировать такую логику:

- по сабмиту получаем данные из формы
- делаем три параллельных запроса, в каждом из которых свои данные формы
- по результату второго запроса - делаем или не делаем четвёртый запрос, в котором используем ответ первого запроса.
- если четвёртый запрос ок - показываем успех с данными из этого запроса-4

На обычноим js это получается просто и понятно:

const submitHandler = async (formData) => {
  const responses = await Promise.all([
    service1.fetchData(formData.fieldValue1),
    service2.fetchData(formData.fieldValue2),
    service3.fetchData(formData.fieldValue3),
  ]);

  if (responses[1].isExistSomeData) {
    const data = await service4.fetchData(responses[0]);
    service5.showSuccess(data);  
  } else {
    service5.showFailure();  
  }
};

Как это будет выглядеть в jsx-компоненте с помощью react-query?)

Вот наивная реализация. Специально спрятал useQuery в массив, чтобы было чуть проще проводить параллели.

const submitHandler = async (formData) => {
  const responses = [
    useQuery({
      queryKey: '0',
      queryFn: () => service1.fetchData(formData.fieldValue1),
    }),
    useQuery({
      queryKey: '1',
      queryFn: () => service2.fetchData(formData.fieldValue2),
    }),
    useQuery({
      queryKey: '2',
      queryFn: () => service3.fetchData(formData.fieldValue3),
    }),
  ];

  const data = useQuery({
    queryKey: '3',
    queryFn: () => service4.fetchData(response[0].data),
    enabled: response[1].data?.isExistSomeData,
  });

  if (responses[1].data?.isExistSomeData) {
    if (!data.isLoading) {
      service5.showSuccess(data.data);
    }
  } else {
    service5.showFailure();  
  }
};

Однако, вызов showSuccess и showFailure ошибочно соседствуют рядом с декларативным подходом react-query, у этого кода могут быть проблемы.

вызов showSuccess и showFailure ошибочно соседствуют рядом с декларативным подходом

Специально для этого кейса у хука useQuery есть целых 3 параметра - onError, onSettled, onSuccess

Так useQuery - это ж хук.. разве он может быть внутри массива, или внутри функции submitHandler вообще?

Хуки внутри компонента могут располагаться везде, если последовательность их вызовов между рендерами постоянна. Ниже анти-пример, никогда так не пишите:

const BadComponent = () => {
  const staff = [
    getSomething({user: useUser()}),
    useSomethingElse(useQuery({})),
  ];
  return <>{useLayout(staff)}</>;
}

А вот внутри submitHandler хуку не место.

Ну так а как реализовать логику submitHandler с помощью react-query?

Я понимаю, что там очень богатое апи.. мутации, condition-query.. и т.д. поэтому и хочу увидеть как с помощью этой библиотеки обработать логику выше, при нажатии на кнопку в рамках какого-то jsx-компонента. Как это правильно делают люди??..)

Потому что по своему опыту - это делается ужасно.. и рекламируемый профит react-query/swr и подобных абсолютно не стоит того.. если даже нельзя описать обычную последовательность запросов сверху\вниз без всяких костылей. Вот и хочу сравнить.. скорее всего я просто не умею пользоваться.

Тут, кажется, фишка в том, что это довольно стандартный флоу, и писать под него каждый раз кастомный хук...

Один раз написал, а потом копируй из проекта в проект. И при командной работе это удобнее, т.к. нажать Ctrl+click и разобраться в 20 строчках кастомного хука - это сильно проще и быстрее, чем искать в интернете страницу незнакомого npm-пакета и изучать его документацию.

Не согласен с проше и быстрее. Особенно с копированием.

Ну, если бы со мной многие были согласны, мир бы не увидел таких нужных вещей, как пакеты is-array и isarray

Вы так говорите, как будто это не нужные пакеты

Абсолютно ненужные.

Sign up to leave a comment.

Articles