ago*_*ori 5 clojure clojurescript om
Om,反应的clojurescript包装,据说非常快,因为它利用了不变性.我无法理解持久性数据结构如何在这里提供帮助.
我所理解的是应用状态是一个原子.此状态传递给返回虚拟DOM节点的函数(om组件),因此创建当前虚拟DOM与其先前状态之间差异的"补丁"比直接在实际DOM上操作要好得多.
但是持久数据结构可以在这里提供帮助吗
(def app-state (atom {:foo {:counter 0}))
(om/root click-counter app-state {:target ...})
Run Code Online (Sandbox Code Playgroud)
例如,click-counter渲染一个按钮,单击该按钮会增加计数器.所以过渡函数看起来像这样:
(dom/button #js {:onClick #(om/transact! app [:foo :counter] inc)}
(str "clicked " (-> app :foo :counter) " times"))
Run Code Online (Sandbox Code Playgroud)
我没有理解这一点:onClick执行时clojurescript创建一个新的地图(非常有效),如下所示:
{:foo {:counter 1}}
Run Code Online (Sandbox Code Playgroud)
而app-state现在指向新的地图.此时Om意识到状态已经改变,因为它只是一个等式检查的问题.
这里的问题是Om应该仍然计算整个旧虚拟DOM和新虚拟DOM之间的差异.它不知道只是计数器被改变了.
我的错误在哪里?
当应用程序状态存储在持久树结构(如地图)中时,状态树的哪些部分没有更改并且不需要更新是显而易见的。这是因为对子级的任何更改都会更改父级。使用可变数据结构,对子级的更改不必更改父级。
因此,如果您的状态如下所示:
{:part1 [1 2 3 4]
:part2 [:a :b]}
Run Code Online (Sandbox Code Playgroud)
然后你通过在第 2 部分中添加一些内容来创建一个新状态:
{:part1 [1 2 3 4]
:part2 [:a :b :c]}
Run Code Online (Sandbox Code Playgroud)
然后比较函数可以查看并发现旧状态和新状态的 :part1 中的值是完全相同的对象,因此不能对任何嵌套状态进行任何更改,因为它是不可变的。
| 归档时间: |
|
| 查看次数: |
173 次 |
| 最近记录: |