Om 是 React 的 clojurescript 包装器,据说速度非常快,因为它利用了不变性。我无法理解持久数据结构如何在这里提供帮助。
我所理解的是应用程序状态是一个原子。此状态被传递给返回虚拟 DOM 节点的函数(om 组件),因此创建当前虚拟 DOM 与其先前状态之间差异的“补丁”比直接在实际 DOM 上操作要好得多。
但是持久数据结构在哪里可以提供帮助?
(def app-state (atom {:foo {:counter 0}))
(om/root click-counter app-state {:target ...})
例如click-counter
,渲染一个按钮,单击该按钮会增加计数器。所以转换函数看起来像这样:
(dom/button #js {:onClick #(om/transact! app [:foo :counter] inc)}
(str "clicked " (-> app :foo :counter) " times"))
我不明白这一点:onClick
执行 clojurescript 时会创建一个新地图(非常有效),如下所示:
{:foo {:counter 1}}
现在app-state
指向新地图。此时 Om 知道状态已更改,因为这只是一次相等检查的问题。
这里的问题是 Om 仍然应该计算整个旧虚拟 DOM 和新虚拟 DOM 之间的差异。它不知道只是改变了计数器。
我的错误在哪里?