我正在学习Elm,看来您每个view
“框架”都创建了一个新的VirtualDOM。
view : Model -> Html Msg
由于没有引用先前生成的Html
值,因此没有选择(以功能性方式)对其进行更新。您必须从头开始重建它。这是非常低效的。
如何重用旧框架并仅更新更改的节点(及其祖先)?
编辑
榆树有Html.Lazy
作为答案。有了它和聪明的运行时,您就可以避免重复大部分工作和数据分配(无用的垃圾收集器压力是一件坏事),但要以增加程序员的认知负担为代价。
在术语级别(而不是类型级别)考虑严格性/惰性是容易出错的(请参见Haskell和seq
)。
完美的解决方案是使用具有以下签名的view
函数:
view : Model -> Html Msg -> Html Msg
通过这种方式,您可以访问先前的框架VirtualDOM,并且可以根据需要与新的框架数据结构共享尽可能多的空间。
此选项可用吗?如果没有,为什么不呢?
答案 0 :(得分:1)
您知道,Elm使用“虚拟DOM”。您的程序将输出描述所需DOM结构的轻量级对象,并且虚拟DOM实现会“区分”当前和新结构,并根据需要添加,修改和删除元素/属性/属性。
当然,与直接操作DOM相比,使用虚拟DOM会有很小的性能损失,但是在大多数Web应用程序中,差异并不重要。如果您发现应用程序的视图功能性能不佳,则有几种提高性能的方法,例如Html.Lazy
许多其他流行的库都使用虚拟DOM,例如React,Angular和Vue。通常,使用虚拟DOM(而不是“手动”操作DOM)呈现应用程序会更容易,因此许多流行的框架都实现了一个。