0

在 redux 教程中,我们学习了如何执行乐观更新:

第 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>;

所以,如果我们的帖子有分页,

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]++
  }
})

4

1 回答 1

2

从 Redux Toolkit 1.7 开始,这是可能的。

它包含一个帮助函数,允许您使用特定标记api.util.selectInvalidatedBy的参数获取所有端点。provide

它可以如下使用:

   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
         })
       )
     }, 
   },
于 2021-11-12T06:39:54.517 回答