preact-db 是 TanStack DB 的 Preact 绑定,导入自 @tanstack/preact-db。它重新导出 @tanstack/db 的全部内容,支持 Preact 10+,只发布 ES 模块。该技能建立在 db-core 之上,集合设置、查询构建器与变更模式需先参考 db-core。
用途与定位 它用于在 Preact 应用中针对具体的源 Collection 建立实时查询,并在组件中订阅查询结果。查询读取的是具体的源 Collection;Preact 目前没有 DbProvider,因此不会绑定 collection 描述符,也不会从 DbClient 读取。对描述符的查询在消费时会抛错。需要基于 DbClient 的 SSR 与 hydration 时,应改用 @tanstack/react-db 或 @tanstack/svelte-db。
主要能力 useLiveQuery 支持三种调用形式:查询回调,例如 useLiveQuery((q) => q.from({ todo: todoCollection }).where(...).orderBy(...));带 query 与 queryKey 的配置对象;以及预先创建好的 live query collection。它返回 data、state、status、isReady、isEnabled 等字段。传入回调并返回 undefined 可让查询处于禁用状态,直到条件满足;此时 data 与 state 为 undefined,可结合 isEnabled 判断。
useLiveInfiniteQuery 用于无限分页,返回 data、pages、fetchNextPage、hasNextPage、isFetchingNextPage。查询必须包含 .orderBy(),并以 { pageSize } 配置页大小。fetchNextPage() 在分页请求结束(无论成败)时 resolve;失败的页加载不会 reject 或改变 status,而是以请求错误形式出现在返回的健康树中。该钩子不接受 getNextPageParam。
状态与错误语义 isLoadingError 表示首次加载失败且没有可展示内容,可提示使用 collection.reload();isCrashed 表示本地存储损坏,只能通过 cleanup({ dependents: true }) 并重新开始恢复。查询就绪后,同步问题不会改变 status,应读取 isSyncError 或健康树来展示数据过期警告。没有 isError。
Preact 相关模式与身份规则 钩子在每次渲染时从查询 IR 推导身份,结构化表达式中捕获的值变化会触发查询重新编译,因此不需要依赖数组。钩子挂载期间,同一个源 Collection ID 必须始终指向同一个 Collection 对象;若先前读取过的 ID 换成了不同对象,会抛出 SourceCollectionIdReuseError。
常见错误 使用不透明查询逻辑(fn.where、fn.select、fn.having 等函数式变体)而没有提供 queryKey 时,查询 IR 没有稳定身份,会抛出 UnhashableQueryIRError;应改用配置对象并在 queryKey 中放入函数捕获的每个值。在 .where() 中应使用 eq() 或 not() 等操作符,而不是 ===,因为后者比较的是查询引用而非值。读取禁用查询的 data 前应先判断 isEnabled,或使用可选链。
使用方式示例 import { eq, not, useLiveQuery } from '@tanstack/preact-db';在组件内调用 useLiveQuery,传入 q.from({ todo: todoCollection }).where(({ todo }) => not(todo.completed)).orderBy(({ todo }) => todo.created_at, 'asc'),再根据 isLoading 渲染加载态并映射 data。
适用场景与限制 适合 Preact 10+ 项目中针对具体 Collection 的实时查询与分页列表展示。限制包括:仅 ES 模块;未提供 DbProvider,描述符查询与 DbClient 读取不可用,SSR 与 hydration 需换用 React 或 Svelte 绑定;不透明查询必须提供 queryKey;挂载期间 Collection ID 与对象须保持一致。其它未在资料中说明的能力、收费或平台信息暂未提供。