#javascript #redux #react-redux #rtk-query
Вопрос:
У меня есть следующий API, определенный для запроса RTK:
export const postsApi = createApi({
reducerPath: "postsApi",
baseQuery: fetchBaseQuery({ baseUrl: 'https://myservice.co/api/v2/' }),
tagTypes: ["Posts"],
endpoints: (builder) => ({
getAllPosts: builder.query({
query: () => ({ method: "GET", url: "/posts" }),
transformResponse: (response) => response.posts,
providesTags: (result) =>
result
? [
...result.map(({ id }) => ({ type: "Posts", id })),
{ type: "Posts", id: "LIST" },
]
: [{ type: "Posts", id: "LIST" }],
}),
updatePost: builder.mutation({
query: ({ postId, ...body }) => ({
url: `/posts/${postId}`,
method: "POST",
config: { body },
}),
invalidatesTags: (_, __, arg) => [{ type: "Posts", id: arg.id }],
}),
getPost: builder.query({
query: (postId) => ({
method: "GET",
url: `/posts/${postId}`,
}),
providesTags: (_, __, id) => [{ type: "Posts", id }],
}),
}),
});
export const { useGetAllPostsQuery, useUpdatePostMutation, useGetPostQuery } = postsApi;
Что я хотел бы сделать, так это то, что когда updatePost успешно вызывается, это приведет к недействительности кэша только для одной записи и будет использовать запрос getPost для повторной фиксации информации вместо Getallpost. Возможно ли это в любом случае? Записи отображаются в таблице, полученной с помощью запроса getAllPosts.
Ответ №1:
Нет. RTK-Запрос-это кэш документов (полный ответ = документ), а не нормализованный кэш. Он ничего не знает о содержимом кэшированных ответов и их структуре — и он никогда не будет пытаться «сшить» что-либо там самостоятельно.
Вы можете сделать это вручную с оптимистичным обновлением, но все, что RTK-Q делает автоматически, — это повторная выборка, которой должно быть более чем достаточно в большинстве случаев использования.
Комментарии:
1. Спасибо за ответ! Есть ли какой-либо способ выполнить оптимистическое обновление, чтобы не запускалась выборка всего списка? Дело в том, что для каждого поста есть вызовы внешних служб, и получение их всех каждый раз при обновлении становится довольно тяжелым. Если это невозможно, единственный способ-использовать кэш в сервисе, предоставляющем сообщения, для удаления дополнительного трафика на другие сервисы.
2. Затем не добавляйте отдельные записи в
providesTags
.providesTags
означает «если это признано недействительным, исправьте это».