
rtk query作为redux toolkit的一部分,提供了一种高效且声明式的方式来管理应用程序中的数据获取和缓存。其核心在于区分两种主要的数据操作类型:query(查询)和mutation(变更)。
builder.query (查询):
builder.mutation (变更):
关键点:query和mutation的区分是基于它们逻辑上的作用(获取数据 vs. 修改数据),而非HTTP请求方法(GET vs. POST)。即使你的数据获取操作必须使用POST请求(例如出于安全考虑),它仍然应该被定义为query,因为它本质上是获取数据而不是修改服务器状态。
RTK Query的强大之处在于其智能的缓存和自动刷新机制,这主要依赖于providesTags和invalidatesTags的协同工作。
为了实现deleteEmployee操作后getEmployees列表的自动刷新,我们需要将getEmployees从mutation类型更改为query类型。
import { createApi } from '@reduxjs/toolkit/query/react';
import customFetchBase from './customFetchBase.js';
export const publicApi = createApi({
reducerPath: 'publicApi',
baseQuery: customFetchBase,
tagTypes: ['employees'], // 定义一个全局的标签类型
endpoints: builder => ({
// 将 getEmployees 定义为 query,因为它用于获取数据
getEmployees: builder.query({ // <-- 关键修改:从 builder.mutation 改为 builder.query
query: ({
formData = "defaultHashedDataString",
salt = "xyz",
pageIndex = 1
}) => ({
url: '/Hafez/Employee/Data',
method: 'POST', // 即使是 POST 请求,只要是获取数据就应是 query
body: {
RequestVerificationToken: salt,
FormData: formData,
currentPage: pageIndex + 1
}
}),
providesTags: ['employees'] // 此 query 提供 'employees' 标签的数据
}),
// deleteEmployee 保持为 mutation,因为它修改数据
deleteEmployee: builder.mutation({
query: ({ formData, salt }) => ({
url: '/Hafez/Employee/Delete',
method: 'POST',
body: { RequestVerificationToken: salt, FormData: formData }
}),
invalidatesTags: ['employees'] // 此 mutation 使 'employees' 标签的数据失效
})
})
});
export const {
useGetEmployeesQuery, // <-- 对应的 Hook 名称也从 Mutation 变为 Query
useDeleteEmployeeMutation
} = publicApi;通过上述修改,当deleteEmployee成功执行并使'employees'标签失效时,任何正在使用useGetEmployeesQuery的组件都将自动触发getEmployees重新获取数据,从而实现前端页面的实时更新,确保删除操作后列表数据的即时同步。
RTK Query通过query和mutation的清晰区分,结合强大的标签失效机制,为React应用提供了高效、声明式的数据管理方案。正确地将数据获取操作定义为query,并利用providesTags和invalidatesTags进行标签管理,是实现数据自动刷新和优化用户体验的关键。理解这一核心原理,即使面对诸如必须使用POST进行数据获取的特殊场景,也能灵活应对,构建健壮且响应迅速的前端应用。
以上就是RTK Query数据自动刷新机制:理解Query与Mutation的正确使用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号