0

0

RTK Query数据自动刷新机制:理解Query与Mutation的正确使用

心靈之曲

心靈之曲

发布时间:2025-09-30 17:47:14

|

800人浏览过

|

来源于php中文网

原创

RTK Query数据自动刷新机制:理解Query与Mutation的正确使用

本教程深入探讨RTK Query中query和mutation的正确应用,以及如何通过标签失效机制实现数据自动刷新。我们将阐明query用于数据获取,mutation用于数据修改的核心原则,并指出它们与HTTP请求方法无关。通过具体代码示例,演示如何将数据获取操作定义为query,从而在相关mutation执行后自动触发数据重载,确保前端数据与后端状态同步。

RTK Query核心概念:Query与Mutation

rtk query作为redux toolkit的一部分,提供了一种高效且声明式的方式来管理应用程序中的数据获取和缓存。其核心在于区分两种主要的数据操作类型:query(查询)和mutation(变更)。

  • builder.query (查询)

    • 用途:用于定义从服务器获取数据的操作。它通常期望是幂等的,即多次执行相同的查询不会产生不同的副作用。
    • 行为:RTK Query会自动管理query的缓存。当其关联的标签被其他操作(通常是mutation)失效时,query会自动触发数据重取。
    • 标签管理:通过providesTags来声明该query提供哪些类型的数据标签。
  • builder.mutation (变更)

    • 用途:用于定义向服务器发送数据以修改其状态的操作,例如创建、更新或删除资源。mutation通常会产生副作用。
    • 行为:mutation不会自动重取数据,但它可以在成功执行后通知RTK Query哪些数据已过时。
    • 标签管理:通过invalidatesTags来声明在mutation成功后,哪些类型的数据标签应该被视为失效。

关键点:query和mutation的区分是基于它们逻辑上的作用(获取数据 vs. 修改数据),而非HTTP请求方法(GET vs. POST)。即使你的数据获取操作必须使用POST请求(例如出于安全考虑),它仍然应该被定义为query,因为它本质上是获取数据而不是修改服务器状态。

数据自动刷新机制

RTK Query的强大之处在于其智能的缓存和自动刷新机制,这主要依赖于providesTags和invalidatesTags的协同工作。

刺鸟创客
刺鸟创客

一款专业高效稳定的AI内容创作平台

下载
  1. 数据提供:当一个query(例如用于获取员工列表的getEmployees)被组件订阅并成功获取数据后,它会根据其providesTags: ['employees']配置,将这些数据标记为属于'employees'类型。这些数据会被缓存起来。
  2. 数据变更与失效:当一个mutation(例如用于删除员工的deleteEmployee)被执行并成功修改了服务器上的数据(删除了一个员工)后,它会根据invalidatesTags: ['employees']通知RTK Query,所有标记为'employees'的数据都已失效。
  3. 自动重取:RTK Query接收到失效通知后,会检查当前所有活跃的query订阅。如果getEmployees``query正在被某个组件使用,并且其提供的标签'employees'已被失效,RTK Query将自动触发getEmployees``query重新执行。这样,前端组件就能获取到最新的员工列表数据,而无需手动触发刷新。

正确实现示例

为了实现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重新获取数据,从而实现前端页面的实时更新,确保删除操作后列表数据的即时同步。

注意事项

  1. 逻辑优先于HTTP方法:再次强调,builder.query和builder.mutation的选择应基于操作的逻辑目的(获取数据 vs. 修改数据),而不是HTTP请求方法(GET、POST、PUT、DELETE等)。即使你的数据获取操作需要使用POST请求,它仍然是query。
  2. 标签类型的一致性:在tagTypes、providesTags和invalidatesTags中使用的标签名称必须保持一致。这是RTK Query识别和管理数据缓存的关键。不一致的标签会导致自动刷新机制失效。
  3. Hook的选择
    • 与query对应的Hook是use[EndpointName]Query(例如useGetEmployeesQuery)。它会自动管理数据的获取、缓存、加载状态和错误处理。
    • 与mutation对应的Hook是use[EndpointName]Mutation(例如useDeleteEmployeeMutation)。它返回一个包含触发函数(如deleteEmployee)、加载状态和错误信息的数组,需要手动调用触发函数来执行操作。
  4. 错误处理与加载状态:query和mutation的Hook都提供了丰富的状态(如isLoading, isFetching, isError, error, isSuccess等),便于在UI中展示加载指示器或错误消息。

总结

RTK Query通过query和mutation的清晰区分,结合强大的标签失效机制,为React应用提供了高效、声明式的数据管理方案。正确地将数据获取操作定义为query,并利用providesTags和invalidatesTags进行标签管理,是实现数据自动刷新和优化用户体验的关键。理解这一核心原理,即使面对诸如必须使用POST进行数据获取的特殊场景,也能灵活应对,构建健壮且响应迅速的前端应用

相关专题

更多
scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

188

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

291

2023.10.25

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

274

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.12.29

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

395

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

416

2023.11.14

HTTP 503错误解决方法
HTTP 503错误解决方法

HTTP 503错误表示服务器暂时无法处理请求。想了解更多http错误代码的相关内容,可以阅读本专题下面的文章。

2095

2024.03.12

http与https有哪些区别
http与https有哪些区别

http与https的区别:1、协议安全性;2、连接方式;3、证书管理;4、连接状态;5、端口号;6、资源消耗;7、兼容性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2058

2024.08.16

c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

25

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.1万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号