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

#redux #redux-toolkit #rtk-query #msw

#возвращение #redux-инструментарий #rtk-запрос #тбо

Вопрос:

У меня есть конечная точка мутации запроса RTK, отклоняющая приложение, которая делает недействительным запрос getApplication. Они находятся в одном и том же API.

 rejectApplication: builder.mutationlt;RejectResponse, stringgt;({  query: (applicationId) =gt; ({  url: `/applications/${applicationId}`,  method: "DELETE",  }),  invalidatesTags: (_result, _error, applicationId) =gt; [  "Status",  { type: "Application", id: "LIST" },  { type: "Application", id: applicationId },  ], }),  
 getApplication: builder.querylt;ApplicationResponse, stringgt;({  query: (applicationId: string) =gt; ({  method: "GET",  url: `/applications/${applicationId}`,  }),  providesTags: (_result, _error, id) =gt; [{ type: "Application", id: id }], }),  

Проблема в том, что у меня есть два компонента, которые используют хук useRejectApplicationMutation, но по какой-то причине только один из них, похоже, правильно удаляет результат запроса из кэша после того, как он был признан недействительным. Я могу наблюдать это с помощью Redux devtools, где я вижу, что действия removeQueryResult отправляются после того, как мутация отклонения выполнена в одном компоненте, но не запускается в другом компоненте. Это приводит к тому, что данные getApplication в компоненте не меняются, что нарушает поток приложения.

 const {  data,  isLoading: getApplicationIsLoading,  isError: getApplicationIsError, } = useGetApplicationQuery(props.application.applicationId as string);  useEffect(() =gt; {  if (data) {  dispatch(setIncompleteApplication(data));  } }, [data]);  

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

 [MSW] 12:37:38 DELETE /v1/applications/XA1234567 (200 OK) [MSW] 12:37:38 GET /v1/status (200 OK)  [MSW] 12:37:39 GET /v1/applications/XA1234567 (200 OK)  

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

Ответ №1:

invalidatesTags не всегда удаляет вещи из кэша. Он удаляет из кэша только те записи кэша, которые в данный момент не используются в компоненте — для всего остального он запускает повторную выборку, поэтому запрос снова запускается, и если в ответе есть новые данные, ответ обновляется соответствующим образом.

Таким образом, в вашем компоненте isFetching переключится на true , но данные не исчезнут — в большинстве случаев это предпочтительное поведение, так как вы не хотите, чтобы все переходило к индикатору загрузки, а просто обновляли отображаемые данные после мутации.

Теперь, если ваша конечная точка возвращает данные, структурно равные данным, которые она возвращала ранее, это также будет не новый data объект, а просто старый. При повторной выборке RTK-запрос сравнивает старый и новый результат и пытается сохранить как можно больше его ссылочного равенства, чтобы useEffects не срабатывать, когда базовые данные на самом деле вообще не изменились.

Комментарии:

1. Я вижу, в этом есть смысл. Спасибо за быстрый ответ.