【发布时间】:2021-09-10 10:16:17
【问题描述】:
我正在阅读 Elm 指南中的优化。它谈到keyed nodes,以美国总统为例:
import Html exposing (..)
import Html.Keyed as Keyed
import Html.Lazy exposing (lazy)
viewPresidents : List President -> Html msg
viewPresidents presidents =
Keyed.node "ul" [] (List.map viewKeyedPresident presidents)
viewKeyedPresident : President -> (String, Html msg)
viewKeyedPresident president =
( president.name, lazy viewPresident president )
viewPresident : President -> Html msg
viewPresident president =
li [] [ ... ]
那就解释一下吧:
现在,Virtual DOM 实现可以识别何时使用列表。它首先通过键匹配所有总统。然后它区分那些。我们对每个条目都使用了惰性,因此我们可以跳过所有这些工作。好的!然后它会计算出如何打乱 DOM 节点以按照您想要的顺序显示内容。所以键控版本最终做的工作要少得多。
我的困惑是:如果我不在键控节点内使用lazy,虚拟 DOM 仍然必须区分列表的每个条目,即使它可以匹配某些键。看来键控节点的用处真的取决于内部的lazy。我的理解正确吗?
【问题讨论】:
-
我的理解是它们在不同的层次上工作。
lazy使用记忆来跳过虚拟 DOM 树的部分计算。键控节点通过将 DOM 节点与其在虚拟 DOM 树中的对应节点进行匹配来减少 DOM 操作的数量。 -
这也是我的理解。但在我看来,如果不同时使用
lazy,键控节点的有效性将大大降低。我只是想确认一下怀疑。 -
无论你是否使用
lazy,都应该产生完全相同的虚拟DOM树。使用lazy只会返回一个先前计算的虚拟DOM 片段,而不是重新计算它。我根本看不出它们会如何相互影响。 -
好的。如果我不使用
lazy,则列表中的每个条目都将被重新计算,而不管键匹配如何。不是吗? -
是的,这是我的理解。这只是记忆化,这意味着结果会根据其输入进行缓存,并且仅根据其输入进行缓存。
标签: elm