跳到主要内容

useWorkingTree()

function useWorkingTree(): WorkingTreeResource;

Defined in: use-working-tree.ts:81

读写当前数据库的工作树。

Returns​

WorkingTreeResource

见 WorkingTreeResource

Throws​

组件树中没有 Provider、Provider 没拿到 db、异步 source 尚未就绪时各抛一条 不同的文案;异步 source 创建失败时原样抛出创建异常(与 useRxDB 同语义)

Example​

const tree = useWorkingTree();

useEffect(() => void tree.status().catch(() => undefined), [tree.status]);

if (tree.statusState.phase === 'empty') return <span>没有未提交的改动</span>;
if (tree.statusState.phase === 'success') {
return <span>{tree.statusState.value.entryCount} 条未提交</span>;
}
return null;

Remarks​

创建入口本身一次 IO 都不发:十二格初值全是 idle,只有真的调了方法才会去读库。 挂上就查会让每个只想拿到 commit() 的组件在挂载时白发一轮查询 —— 而 React 下这还会 在 StrictMode 里变成两轮。

没有变更流:状态只在经本入口发出的命令之后更新。别的标签页写进来的改动、直接走 entity.save() 的写入,都不会触发重渲染 —— 需要最新值就再调一次 status()。这是核心 侧至今没有工作树变更流的如实反映,不是这里省了一步。

状态用 useState 而不是 useSyncExternalStore:状态源就在 React 里(本 hook 自己的 命令产生它),不是外部 store,没有撕裂可言。

数据库取不到时抛错而不是返回一份「一切干净」的默认值:那会把「入口没接上」 伪装成「没有未提交变更」,恰好是最需要出声的时候不出声。