用途
本技能面向 TanStack DB 的 React 绑定,帮助在 React 项目中实现基于集合(collection)的实时响应式数据查询。它构建在 db-core 之上,资料明确说明:使用前应先阅读 db-core,以了解集合设置、查询构建器与变更模式。
主要能力
导入方式
@tanstack/react-db 会重导出 @tanstack/db 的全部内容。资料建议:在 React 项目中,统一从 @tanstack/react-db 导入所有内容。
钩子
useLiveQuery
支持多种用法,资料描述了 8 种重载形式(如查询函数、配置对象、预创建集合、禁用状态等):
- 查询函数加依赖数组:返回 data、state、collection、status、isLoading、isReady、isError、isIdle、isCleanedUp 等。
- 配置对象:可传入 query 与 gcTime 等。
- 预创建集合:可直接传入(例如来自路由加载器)。
- 条件查询:在查询函数中返回 undefined/null 可禁用查询,此时 status='disabled'、data=undefined。
useLiveSuspenseQuery
返回的 data 始终有定义、不会为 undefined。资料强调必须包裹在 <Suspense> 和 <ErrorBoundary> 中使用;带依赖数组时,依赖变化会触发重新 suspend。
useLiveInfiniteQuery
用于无限滚动分页:data 为已加载所有页的扁平数组,提供 fetchNextPage()、hasNextPage、isFetchingNextPage。调用时传入查询函数、{ pageSize: 20 } 以及依赖数组。
usePacedMutations
用于节流/防抖变更,需配合 debounceStrategy,例如 debounceStrategy({ wait: 500 })。资料给出示例:在 onMutate 中通过 noteCollection.update 修改草稿,mutationFn 中调用 API 更新。
includes(层级数据)
当查询使用 includes(在 select 中嵌套子查询)时,默认每个子字段是一个实时 Collection,可在子组件中用 useLiveQuery 订阅。这样当某条子项变化时,只有受影响的子组件重渲染,父组件不会重渲染。若使用 toArray(),子结果为普通数组,父组件会在子项变化时重渲染。完整 includes 规则(关联条件、嵌套 includes、聚合)需参阅 tanstack-db-core-live-queries 技能。
虚拟属性
实时查询结果的每一行会自动包含只读的计算虚拟属性:
$synced:行被同步确认时为 true,仍处于乐观状态时为 false。$origin:最后一次确认变更来自本客户端则为 "local",否则为 "remote"。$key:结果的行键。$collectionId:来源集合 ID。
资料指出这些属性会自动添加,可用于 where、select 和 orderBy 子句,但不应持久化回存储。
React 特有模式
- 依赖数组:需包含所有外部响应式值;空数组表示静态查询、不会重跑;不传数组则每次渲染都重跑(资料认为通常是错误的)。
- Suspense + Error Boundary:使用 useLiveSuspenseQuery 时需同时包裹两者。
- 路由加载器预加载:在 route loader 中使用
await todoCollection.preload(),组件内即可立即获取数据;完整预加载模式需参阅 tanstack-db-meta-framework 技能。
使用方式
按资料示例,基础用法为从 @tanstack/react-db 导入 useLiveQuery 等,随后在组件中调用 useLiveQuery,传入查询函数(可含 from、where、orderBy 等),并按需传入依赖数组。
适用场景
适用于 React 项目中使用 TanStack DB 构建实时、可乐观更新的数据展示与交互,包括列表过滤、条件查询、无限分页、节流编辑、层级数据(如项目与问题)等场景。
限制与注意事项
资料列出了若干常见错误与约束:
- 依赖数组遗漏外部值会导致查询不重跑、显示过期结果(CRITICAL)。
- 使用 useLiveSuspenseQuery 而不加 Error Boundary:该钩子在渲染中抛错,缺少 Error Boundary 会导致整个应用崩溃(HIGH)。
- 重复安装
@tanstack/db导致 "Not a Collection"(InvalidSourceError):通常是因为装了两份 @tanstack/db,集合由其中一份创建而 useLiveQuery 用另一份做 instanceof 检查。开发模式下检测到两份实例还会抛出 DuplicateDbInstanceError。可用pnpm ls @tanstack/db诊断,并通过 pnpm overrides 或 Vite resolve.alias 修复;根因通常是某依赖自带副本而未将 @tanstack/db 声明为 peerDependency。 - 查询表达力与 IVM 约束的张力(HIGH):查询构建器看似 SQL,但有 SQL 没有的约束——只支持等值连接、limit/offset 需要 orderBy、没有 select 时不能 distinct 等;AI 代理写的 SQL 风格查询容易违反这些约束。完整约束需参阅 tanstack-db-core-live-queries 技能的 Common Mistakes。
其他安装方式、收费、价格、平台等事实资料未提供。