redux RTK查询中提供缓存失效标签有什么区别?

pkwftd7m  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(139)

我正在按照官方文档学习RTK查询,但是,我不知道这样该高速缓存失效有什么区别

getUsers: build.query<User[], void>({
      query: () => '/users',
      providesTags: ['User'],
    }),

还有这个

providesTags: (result, error, arg) =>
        result
          ? [...result.map(({ id }) => ({ type: 'Post' as const, id })), 'Post']
          : ['Post'],

文档解释了For more granular control over the provided data, provided tags can have an associated id. This enables a distinction between 'any of a particular tag type', and a specific instance of a particular tag type'.,但是,我不知道它是什么意思。invalidatesTags也一样

nwlqm0z1

nwlqm0z11#

在第一种情况下,你提供了一个硬编码的标签名称来获取用户。让我们假设在用户下你想显示他们的帖子,并且你也有一个“添加帖子”按钮来发送一个变异来添加帖子。如果我们传递一个硬编码的标签而不是函数,会发生什么

providesTags: ['Post'],

当我们为查询提供标签时,每个查询都会获得一个标签名称kind id。因此,当我们使用ADD POST变异向服务器发送post请求时,我们会将invalidatesTags:["Post"]传递给变异,因此,变异完成后,变异将查找标签名称为'Post'的查询。它会认为查询已经过时,所以它会再次使用提供标记运行查询,且应用程序商店将使用最新的数据填充。
假设您的页面上有10个用户,您为User-1单击了Add a Post按钮。它将运行“ADD POST”变异,然后查找提供的“POST”标记,并使该查询无效并重新获取数据。在您的情况下,为User-1运行变异,将为所有10个用户运行get查询,因为所有用户帖子get查询都标记为“Post”。但您仅改变了User-1的帖子,因此您应仅重新获取User-1的帖子查询。
这就是为什么我们要传递一个函数来动态定义标签名,这个函数有3个参数:(错误ar清除)
result是存储中的帖子。
arg是调用查询时传递的参数。假设您调用了getUserPostQuery(user),则可以使用arg在函数内部访问此user

providesTags: (result, error, arg) =>
        // i believe it should have been `arg.id`. otherwise id would be undefined. we are fetching user's post
       // result would be the user's posts
        result
          ? [...result.map(({ id }) => ({ type: 'Post' as const, id:arg.id })), 'Post']
          : ['Post'],

因此,我们动态地将标记名定义为

{ type: 'Post' as const, id:arg.id }

您必须使用相同的函数签名定义invalidatesTags属性,以创建要使其无效的动态标记名。
在这个实现中,如果您现在修改User-1的post,redux将只为User-1运行get查询。

相关问题