所以我在我的应用程序中使用 RTK 查询,并且我之前在多个应用程序中使用过它(而且它看起来很简单并且节省了很多时间)。但我有一个关于身份验证的问题。
所以我处理身份验证的方式是创建一个单独的切片来存储用户详细信息,所以我调用了使用 RTK 查询创建的登录用户(或注册用户)的突变,然后取回响应并分派操作将数据存储在为数据创建的另一个切片中,以便我可以在任何屏幕(如令牌、用户名等)中访问数据。
但是由于 RTK 查询也将响应保存在缓存中(如果我没记错的话),创建一个不同的切片来存储一些已经自动存储的数据对我来说似乎有点不对。
所以我想知道是否有一种方法可以直接访问缓存并对其进行其他操作,例如完全删除缓存(如果用户注销),更新缓存(例如,如果令牌刷新,或者用户更改用户名或任何其他更新)。
还有一点,此数据(即用户特定数据,如令牌、用户名、电子邮件等)不仅在登录后返回,而且如果用户注册或重置密码(在密码重置中,我是直接登录用户,而不让他在重置密码后手动执行此操作)。
在那种情况下,我想要一个缓存对象或文档来存储数据。
阅读文档后,我找到了答案。为了在突变之间共享数据,我们可以在所有突变中使用
fixedCacheKey: "logindata"
将缓存命名为logindata
(可以随意命名)。
例如,如果我有两个突变,
login
和 register
,我们希望它们具有相同的缓存键,我们可以这样做;
const [login, {isLoading}] = useLoginMutation({fixedCacheKey: "logindata"})
const [login, {isLoading}] = useRegisterMutation({fixedCacheKey: "logindata"})
我认为我们现在也可以使用 useSelector 访问数据,因为密钥现在没有改变并且固定为
logindata
(尚未尝试)。
现在我正在努力清除整个缓存,包括突变缓存。
编辑:
我们可以使用
api.util.resetApiState()
清除整个缓存。我只是忘了发送它,所以它不起作用。
dispatch(api.util.resetApiState())
,清除整个缓存(通常可以在注销时使用)。
现在剩下的最后一步,从另一个突变更新一个突变的缓存(不是完全替换,而是只更新一个属性)。
在RTK(Redux Toolkit)中,缓存数据是通过REDux的entities和slice来处理的。要访问、更新和删除 RTK 查询中的缓存,您可以使用 RTK
createEntityAdapter
方法,它创建一组帮助函数来访问缓存中的数据。
在RTK查询中访问缓存数据,可以使用对应实体切片的
selecttall
函数。例如,如果你有一个users
实体,那么所有缓存用户都可以通过selectAll(users)
访问。
在RTK查询中更新缓存中的数据,可以使用对应实体切片的
upsertOne
函数。例如,如果你想更新一个缓存用户,你可以调用upsertOne(users, updatedUser)
.
要删除RTK查询中的缓存,可以使用相应实体切片的
removeOne
或removeAll
功能。比如要删除缓存中的用户,可以调用removeOne(users, userId)
。如果要清除缓存中的所有用户,可以调用removeAll(users)
.
需要注意的是,在使用 RTK 时,缓存数据会自动与 Redux 的状态同步。因此,缓存数据的任何变化也会反映在 Redux 的状态中。