gpt4 book ai didi

clojure - 持久数据结构如何帮助 Om 更快

转载 作者:行者123 更新时间:2023-12-02 18:43:00 27 4
gpt4 key购买 nike

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 创建一个新 map (非常有效),如下所示:

{:foo {:counter 1}}

app-state现在指向新 map 。此时,Om 意识到状态已更改,因为这只是一个相等检查的问题。

这里的问题是 Om 仍然应该计算整个旧虚拟 DOM 和新虚拟 DOM 之间的差异。它不知道只是计数器发生了变化。

我的错误在哪里?

最佳答案

当应用程序状态存储在持久树结构(如 map )中时,状态树的哪些部分没有更改立即显而易见,并且不需要更新。这是因为对子级的任何更改都会更改父级。使用可变数据结构,对子级的更改不必更改父级。

如果你的状态是这样的:

{:part1 [1 2 3 4]
:part2 [:a :b]}

然后你通过在第2部分中添加一些内容来创建一个新状态:

{:part1 [1 2 3 4]
:part2 [:a :b :c]}

然后比较函数可以查看并发现旧状态和新状态的 :part1 中的值是完全相同的对象,因此不能对任何嵌套状态进行任何更改,因为它是不可变的。

关于clojure - 持久数据结构如何帮助 Om 更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30719169/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com