Redux запрашивает несколько createApi и редуктора с повторной выборкой

Мое приложение должно получать данные с трех разных серверов, все они подключены к одной БД. Таким образом, я разделил код на 3 разных API-интерфейса createAPI и использовал разные пути к редуктору, однако кажется, что я не могу использовать повторную выборку, если выполняю редактирование PUT из API A, но API B также требует обновления.

Я не могу изменить расположение серверов, поскольку это наша архитектура серверных серверов.

export const commonApi = createApi({
  reducerPath: "commonApi",
  baseQuery: commonBaseQuery, //URL: common.dev.example.com
  endpoints: () => ({}), //later injected
  tagTypes: ["SCHEME_LIST", "SCHEME_DETAIL"],
});

export const taskApi = createApi({
  reducerPath: "taskApi",
  baseQuery: taskBaseQuery, //URL: task.dev.example.com
  endpoints: () => ({}), //later injected
  tagTypes: ["LIST", "DETAIL"]
});

export const addressApi = createApi({...}) // omitted, same as above with different url

Теперь, если я использую запрос на мутацию editTask из taskAPI. Необходимо обновить getTaskList, getTaskDetail с taskAPI. Используя invalidatesTags: ['LIST', 'DETAIL'], я могу автоматически получить изменения.

Однако при этом editTask API getWarehouseList от commonAPI также необходимо обновить, чтобы отразить некоторые изменения. Я больше не могу использовать теги, поскольку они не принадлежат одному и тому же createApi/reducerPath.

Вопрос в том, как мне обновить это getWarehouseList из commonAPI, когда editTask из taskAPI вносит изменения? Или единственный способ — выполнить unwrap().then() и просто вручную обновить эти данные?

Если все они предоставляют вам данные из одной и той же базы данных, а это означает, что данные связаны и согласуются друг с другом, вам следует поместить их в один и тот же API, а не в три разных, даже если вы получаете данные с разных URL-адресов.

phry 06.04.2024 11:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать утилиту фрагмента API validateTags , чтобы сделать недействительными любые конкретные теги, которые вам нравятся. Его можно использовать так: конечные точки мутации в commonApi могут сделать недействительными определенные теги в taskApi, и наоборот. Для этого я бы предложил использовать обработчик onQueryStarted конечной точки мутации.

Пример:

фрагмент TaskAPI

...
editTask: build.mutation({
  ...
  onQueryStarted: async(arg, { dispatch, queryFulfilled }) => {
    try {
      await queryFulfilled;
      dispatch(commonAPI.util.invalidateTags(
        ["SCHEME_LIST", "SCHEME_DETAIL"] // or whatever you specifically need
      ));
    } catch(error) {
      // handle/ignore/etc
    }
  },
}),
...

Как бы то ни было, использование unwrap().then() в коде пользовательского интерфейса также может сработать, хотя я все равно предлагаю вручную объявлять теги недействительными, а не выполнять их повторную выборку вручную. Что-то вроде следующего:

try {
  await editTaskTrigger().unwrap();
  dispatch(commonAPI.util.invalidateTags(["SCHEME_LIST", "SCHEME_DETAIL"]));
} catch(error) {
  ...
}

хороший! Спасибо. Я знал только о *.util.updateQueryData/updateUpsertData. Не знал, что внутри этого можно просто сделать теги недействительными. Теперь все работает как задумано!

Slodin 06.04.2024 01:25

Другие вопросы по теме