是否可以乐观地更新端点的所有缓存?
Is it possible to optimistically update all caches of a endpoint?
在 redux 教程中,我们学习了如何执行乐观更新:
part-8-rtk-query-advanced#implementing-optimistic-updates
但是在updateQueryData的API引用中,我发现必须传入一个args
:
const updateQueryData = (
endpointName: string,
args: any,
updateRecipe: (draft: Draft<CachedState>) => void
) => ThunkAction<PatchCollection, PartialState, any, AnyAction>;
所以,如果我们的 post 有分页,
getPosts: builder.query({
query: (current: number) => `/posts?current=${current}`,
providesTags: ['Post']
}),
这个时候,我们将如何进行乐观更新呢?
// Is there a way to update all getPosts caches?
// Am I missing some documents?
apiSlice.util.updateQueryData('getPosts', ???, (draft) => {
const post = draft.find((post) => post.id === postId)
if (post) {
post.reactions[reaction]++
}
})
从 Redux Toolkit 1.7 开始,这是可能的。
它包含一个 api.util.selectInvalidatedBy
辅助函数,允许您使用 provide
d 特定标记的参数获取所有端点。
可以如下使用:
async onQueryStarted({ id, ...patch }, { dispatch, queryFulfilled, getState }) {
for (const { endpointName, originalArgs } of api.util.selectInvalidatedBy(getState(), [{ type: "Post", id}])) {
// we only want to update `getPosts` here
if ( endpointName !== 'getPosts') continue;
dispatch(
api.util.updateQueryData(endpoint, originalArgs, (draft) => {
// find in list & update
})
)
},
},
在 redux 教程中,我们学习了如何执行乐观更新:
part-8-rtk-query-advanced#implementing-optimistic-updates
但是在updateQueryData的API引用中,我发现必须传入一个args
:
const updateQueryData = (
endpointName: string,
args: any,
updateRecipe: (draft: Draft<CachedState>) => void
) => ThunkAction<PatchCollection, PartialState, any, AnyAction>;
所以,如果我们的 post 有分页,
getPosts: builder.query({
query: (current: number) => `/posts?current=${current}`,
providesTags: ['Post']
}),
这个时候,我们将如何进行乐观更新呢?
// Is there a way to update all getPosts caches?
// Am I missing some documents?
apiSlice.util.updateQueryData('getPosts', ???, (draft) => {
const post = draft.find((post) => post.id === postId)
if (post) {
post.reactions[reaction]++
}
})
从 Redux Toolkit 1.7 开始,这是可能的。
它包含一个 api.util.selectInvalidatedBy
辅助函数,允许您使用 provide
d 特定标记的参数获取所有端点。
可以如下使用:
async onQueryStarted({ id, ...patch }, { dispatch, queryFulfilled, getState }) {
for (const { endpointName, originalArgs } of api.util.selectInvalidatedBy(getState(), [{ type: "Post", id}])) {
// we only want to update `getPosts` here
if ( endpointName !== 'getPosts') continue;
dispatch(
api.util.updateQueryData(endpoint, originalArgs, (draft) => {
// find in list & update
})
)
},
},