我正在按照官方文档学习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
也一样
1条答案
按热度按时间nwlqm0z11#
在第一种情况下,你提供了一个硬编码的标签名称来获取用户。让我们假设在用户下你想显示他们的帖子,并且你也有一个“添加帖子”按钮来发送一个变异来添加帖子。如果我们传递一个硬编码的标签而不是函数,会发生什么
当我们为查询提供标签时,每个查询都会获得一个标签名称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
因此,我们动态地将标记名定义为
您必须使用相同的函数签名定义
invalidatesTags
属性,以创建要使其无效的动态标记名。在这个实现中,如果您现在修改User-1的post,redux将只为User-1运行get查询。