@tanstack/preact-query 的 QueryClientProvider:让 Preact 应用全局共享 QueryClient 的根组件

发布时间:2026/10/26 23:52:16

@tanstack/preact-query 的 QueryClientProvider:让 Preact 应用全局共享 QueryClient 的根组件 tanstack/preact-query 的 QueryClientProvider让 Preact 应用全局共享 QueryClient 的根组件【免费下载链接】query Powerful asynchronous state management, server-state utilities and data fetching for the web. TS/JS, React Query, Solid Query, Svelte Query and Vue Query.项目地址: https://gitcode.com/GitHub_Trending/qu/queryQueryClientProvider 是tanstack/preact-query中把QueryClient实例注入 Preact 组件树的标准入口它在组件挂载与卸载时分别调用client.mount()/client.unmount()从而把客户端订阅到 focus / online 事件。读完本文你将掌握 QueryClientProvider 的完整使用姿势、props 语义、基于 Context 的传递机制以及它与useQueryClient、useQuery等 Hook 协同工作时的注意事项。一、QueryClientProvider 是什么在tanstack/preact-query的架构中QueryClient负责管理查询缓存QueryCache、变更缓存MutationCache与各类默认选项是整个数据获取体系的中枢对象。为了让组件树中任意层级的useQuery、useMutation、useQueryClient等 Hook 都能访问到同一个客户端需要把QueryClient放到 Preact 的 Context 中——这正是QueryClientProvider的职责。官方参考文档 QueryClientProvider.md 给出了其函数签名function QueryClientProvider(__namedParameters): VNode;组件接收一个名为client的必填属性把传入的children包裹在上下文 Provider 中返回使子树内的所有 Hook 都能通过useQueryClient读取到这个QueryClient实例。该组件的类型定义与实现位于 QueryClientProvider.tsx与 React 版 react-query/src/QueryClientProvider.tsx、Solid 版 solid-query/src/QueryClientProvider.tsx 保持同构的设计——它属于框架适配层真正的心智模型是全局唯一客户端 上下文注入。二、props 语义client 与 childrenQueryClientProvider接受的属性由类型别名QueryClientProviderProps定义其完整声明见 QueryClientProviderProps.md 与源码 QueryClientProvider.tsxexport type QueryClientProviderProps { /** * **Required** * * The QueryClient instance to provide. */ client: QueryClient /** * The components that get access to the provided QueryClient. */ children?: ComponentChildren }两个属性含义如下属性类型必填说明clientQueryClient是要向下注入的QueryClient实例通常由new QueryClient()创建childrenComponentChildrenPreact 组件子节点类型否可以读取该QueryClient的组件子树注意children类型来自 Preact 自身的ComponentChildren意味着它可以是单个 VNode、组件数组、文本节点等 Preact 合法子内容。三、最小可用示例参考文档中给出的最简用法如下这也是绝大多数应用的标准起步写法import { QueryClient, QueryClientProvider } from tanstack/preact-query const queryClient new QueryClient() function App() { return QueryClientProvider client{queryClient}.../QueryClientProvider }queryClient通常被创建在组件外部模块级作用域从而保证整个应用生命周期内复用同一个实例避免每次渲染重新创建导致缓存丢失。仓库自带的真实可运行示例 examples/preact/simple/src/index.tsx 展示了完整用法创建全局queryClient用QueryClientProvider包裹App /子组件内部通过useQuery请求 GitHub 仓库信息import { render } from preact import { QueryClient, QueryClientProvider, useQuery, } from tanstack/preact-query const queryClient new QueryClient() export function App() { return ( QueryClientProvider client{queryClient} Example / /QueryClientProvider ) } const Example () { const { isPending, error, data, isFetching } useQuery({ queryKey: [repoData], queryFn: async () { const response await fetch( https://api.github.com/repos/TanStack/query, ) return await response.json() }, }) if (isPending) return Loading... if (error ! null) return An error has occurred: error.message return ( div h1{data.full_name}/h1 p{data.description}/p strong {data.subscribers_count}/strong{ } strong✨ {data.stargazers_count}/strong{ } strong {data.forks_count}/strong div{isFetching ? Updating... : }/div /div ) }该示例同时演示了三个要点Provider 位于组件树根部、业务组件无需手动传递客户端、子组件直接消费全局 client 发起的查询状态。想了解组件树应如何组织可结合 preact 快速上手文档 阅读。四、源码视角Provider 内部做了什么只看 API 文档容易把QueryClientProvider当作一个无脑透传的包裹组件。但阅读其实现 QueryClientProvider.tsx 会发现它在挂载阶段承担了两个关键职责export const QueryClientProvider ({ client, children, }: QueryClientProviderProps): VNode { useEffect(() { client.mount() return () { client.unmount() } }, [client]) return ( QueryClientContext.Provider value{client} {children} /QueryClientContext.Provider ) }4.1 生命周期绑定mount / unmount组件挂载后通过useEffect立即调用client.mount()并利用 Preact Hook 的清理函数在卸载时调用client.unmount()。effect 的依赖数组是[client]也就是说当传入的client实例发生变化时旧客户端会被正确卸载、新客户端会被挂载——这为运行时热切换客户端提供了保证。官方参考文档 QueryClientProvider.md 对这套行为给出的说明是当应用重新获得焦点或恢复在线时客户端会恢复所有被暂停paused的 mutation并按需重新拉取数据。4.2 mount / unmount 的底层实现QueryClient.mount()/QueryClient.unmount()定义在 query-core 的 queryClient.tsmount(): void { this.#mountCount if (this.#mountCount ! 1) return this.#unsubscribeFocus focusManager.subscribe(async (focused) { if (focused) { await this.resumePausedMutations() this.#queryCache.onFocus() } }) this.#unsubscribeOnline onlineManager.subscribe(async (online) { if (online) { await this.resumePausedMutations() this.#queryCache.onOnline() } }) } unmount(): void { this.#mountCount-- if (this.#mountCount ! 0) return this.#unsubscribeFocus?.() this.#unsubscribeFocus undefined this.#unsubscribeOnline?.() this.#unsubscribeOnline undefined }从源码可以提炼出三个值得注意的实现细节订阅 focus 与 online 事件mount()会向focusManager与onlineManager订阅事件。窗口重新聚焦时执行恢复暂停的 mutation queryCache.onFocus()网络重新在线时执行恢复暂停的 mutation queryCache.onOnline()这正是 Provider 能让查询在切回标签页 / 恢复网络后自动刷新的根本原因。引用计数防抖#mountCount字段保证同一个 client 被多个 Provider 同时挂载时底层事件订阅只建立一次全部卸载后才真正取消订阅。这意味着你可以安全地在一个应用中嵌套多个QueryClientProvider而不会重复注册监听器。幂等安全重复调用mount()在已挂载状态下再次调用不会重复订阅重复unmount()也不会在下溢时出错边界处理集中在 count 判断上。这些细节解释了为什么文档强调由 Provider 负责调用client.mount()/client.unmount()——开发者不需要也不应该手动调用这两个方法。五、通过 useQueryClient 消费上下文Provider 注入的客户端通过一个模块级导出的 Context 来传递其定义同样位于 QueryClientProvider.tsxexport const QueryClientContext createContextQueryClient | undefined( undefined, )配套的 Hook 是 useQueryClient.md 中描述的useQueryClient实现见 QueryClientProvider.tsxexport const useQueryClient (queryClient?: QueryClient) { const client useContext(QueryClientContext) if (queryClient) { return queryClient } if (!client) { throw new Error(No QueryClient set, use QueryClientProvider to set one) } return client }useQueryClient的取值优先级为显式传入的可选参数queryClient用于强制使用某个自定义客户端否则返回 Context 中最近一层的QueryClient如果组件树中根本没有QueryClientProvider会抛出错误No QueryClient set, use QueryClientProvider to set one。这一行为意味着useQuery、useMutation等 Hook 一旦脱离 Provider 使用会直接报错。在实际项目中这通常发生在把查询 Hook 用到了被渲染在 Provider 外部的组件、Portal、独立挂载的弹层里——排查时优先检查组件树位置即可。由该源码可推断一个重要能力由于 Preact Context 支持嵌套覆盖你完全可以在应用中用多个QueryClientProvider形成部分隔离的区域让特定子树使用不同的缓存与配置例如管理后台使用独立 client。useQueryClient的可选参数则为绕过 Context、显式指定客户端提供了逃生通道这在编写组件库、测试夹具时尤其有用。六、与其他数据源 Provider 的关系除了QueryClientProvidertanstack/preact-query还暴露了管理恢复状态的上下文组件例如 IsRestoringProvider 与配套的useIsRestoringHook以及用于 SSR / 持久化场景的 HydrationBoundary。它们的共性是通过 Preact Context 把基础设施对象QueryClient、恢复标记、水合数据注入组件树再由上层查询 Hook 消费。在项目中的典型组装顺序通常为QueryClientProvider client{queryClient} IsRestoringProvider value{isRestoring} {/* 应用的其余组件树 */} /IsRestoringProvider /QueryClientProvider关于其余全部公开函数与变量的完整索引可查阅 preact 参考索引。七、最佳实践小结结合官方文档、源码与示例在实际项目中推荐遵循以下约定全局单例const queryClient new QueryClient()写在模块顶部随应用进程复用避免组件内反复new。挂在最根部把QueryClientProvider放在 App 根节点附近保证所有需要查询能力的子树都能取到客户端。不要手动 mount/unmount生命周期由 Provider 的useEffect托管手写调用只会造成重复订阅或内存泄漏。缺失 Provider 的错误处理牢记useQueryClient在无 Provider 时会 throw用错误栈定位脱离 Provider 的查询 Hook。多实例场景利用嵌套需要隔离缓存时嵌套多层 Provider底层 count 机制保证不会重复订阅全局事件。想深入了解QueryClient的完整 API缓存管理、默认选项、resumePausedMutations等可直接阅读 query-core 的 QueryClient 类源码它是 Provider 所注入对象的全部能力来源。【免费下载链接】query Powerful asynchronous state management, server-state utilities and data fetching for the web. TS/JS, React Query, Solid Query, Svelte Query and Vue Query.项目地址: https://gitcode.com/GitHub_Trending/qu/query创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/25 0:54:59

Spring Boot整合MinIO:从安装部署到文件上传下载实战

从“本地磁盘不够用了”到“想搭个私有云盘”,再到“项目里要接一个文件服务”,MinIO 都是我第一个想到的东西。作为一款兼容 Amazon S3 协议的对象存储,它部署简单、社区活跃,而且用起来还算顺手。前阵子我用 Spring Boot 整合了…

2026/10/25 16:17:19

2026专科生降AI率平台推荐,实测三款不踩坑

专科毕业论文的AI检测要求逐年收紧,不少院校已把“AI率低于30%”列为送审硬性门槛。查重过了但AI率超标、学校只给一次修改机会——这类情况在专科生里越来越常见。降AI率这件事,选对工具能省下大半时间。aibiye、aicheck、passbug三款平台各有侧重&…

2026/10/25 17:16:05

Selenium等待机制详解:显式等待与隐式等待的坑与实战

1. 为什么你的自动化测试总在黎明前崩溃 先说一个我见过无数次的场景:脚本在本地跑得好好的,一到CI环境就随机飘红,报错信息十有八九是 ElementNotVisibleException 或者 NoSuchElementException 。新手第一反应是“定位写错了”&#xf…

2026/10/26 23:47:24

军工AI系统测试:特殊挑战与防御性编码实践

1. 军工AI系统测试的特殊性与风险边界军工AI系统与传统商业软件存在本质差异,其测试环节的容错率几乎为零。我曾参与某型无人机火控系统的测试验证,亲眼见证过测试脚本的异常执行导致模拟攻击偏离靶标3.7公里的案例。这类系统通常具有三个致命特性&#…

2026/10/26 23:47:24

GS-Pool:面向3D高斯溅射的语义级对象变更检测方法

1. 这不是“换个模型就能检测变化”——GS-Pool解决的是3DGS场景下最棘手的语义级变更定位问题你有没有试过在重建好的3D高斯场景里,想快速知道“哪棵树被移走了”“哪个窗户被贴了膜”“哪块砖被替换成新材质”?不是靠肉眼扫一遍,而是让算法…

2026/10/26 23:47:24

军工AI系统测试:特殊要求与CAPL脚本实践

1. 军工AI系统测试的特殊性与风险军工AI系统与其他行业软件有着本质区别,其测试过程不仅关乎功能正确性,更直接涉及人身安全和国家安全。这类系统通常具有以下特征:实时性要求极高:战场环境下毫秒级延迟可能导致致命后果容错率为零…

2026/10/26 23:47:24

电赛E题云台控制:状态机、视觉闭环与联调排障

简介:这份2023年全国大学生电子设计竞赛E题参考包,面向备赛团队、嵌入式课程学习者与赛前自测人群,围绕基于STM32F1的自动追光云台展开,兼顾教学演示与竞赛考核场景,可用于方案复现、代码研读和赛前演练。压缩包共199个…

2026/10/26 23:47:24

政务RPA技术解析与落地实践指南

1. RPA与智慧政务的现状解析RPA(机器人流程自动化)技术正在全球范围内掀起一场政务效率革命。根据最新行业报告,2023年国内政务领域RPA部署量同比增长超过200%,这个数字背后是无数基层公务员从重复劳动中解放的真实案例。我在某省…

2026/10/26 23:42:24

MATLAB实现BiLSTM多输入单输出回归预测实战

简介:本资源是一份面向机器学习初学者与MATLAB实践者的回归预测实战材料,聚焦BiLSTM(双向长短期记忆神经网络)在多输入单输出场景下的建模与实现。适用于时间序列预测、气象建模、工业参数估计等需融合多维时序特征的连续值预测任…

2026/10/26 0:20:20

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/26 1:53:47

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/26 0:20:17

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/26 0:00:48

Nested Learning:解决AI灾难性遗忘的分层记忆架构

1. 为什么AI需要"记忆"能力?在传统深度学习模型中,我们常遇到一个根本性问题:模型在处理新任务时,往往会完全遗忘之前学到的知识。这种现象被业界称为"灾难性遗忘"(Catastrophic Forgetting)。想象一下&#…

2026/10/26 0:00:48

企业级大模型应用:OCR预处理、Dify编排与DeepSeek落地实战

1. 这不是“用大模型”,而是重构工作流的起点“大模型的应用和工具”——这八个字现在被贴在无数技术分享、招聘JD、内部立项书的标题栏里,但绝大多数人点进去后看到的,是零散的API调用示例、几个开源UI截图、或者一句“接入LLM就能降本增效”…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑