Elm与React:为什么Elm中没有生命周期函数?

4

我已经使用过Elm开发了几个应用程序,现在也用React开发了几个。

在React中,我可以使用shouldComponentUpdate等函数来控制组件的渲染频率。

现在我才想起来:为什么Elm没有(或者不需要)这些函数呢?


3
附注:使用 React Hooks,通常不再需要生命周期方法。 - TrueWill
1个回答

7
针对重新渲染的具体问题,Elm默认使用虚拟DOM diff技术:如果其虚拟DOM发生更改,则实际DOM也会相应更新。这比直接操作DOM要便宜得多。
有趣的是,在使用Html.lazy时,Elm的行为与React在将组件定义为函数时的行为相同(即不是从继承自ComponentPureComponent类的对象中定义):由于您不依赖于副作用(生命周期函数就是一个适当的例子),因此在给定相同的函数输入时,您的组件将始终生成相同的输出。因此,在这种方式下,您不必考虑是否需要重新渲染您的组件:Elm会处理。
那么,这些生命周期方法怎么办?例如:
- shouldComponentUpdate: 如上所述,使用Html.lazy时,Elm会检查您的输入是否发生了变化:如果没有发生变化,则在函数上下文中无需重新渲染。否则,Elm将对其虚拟DOM进行diff。但无论哪种情况,Elm都不需要告诉您是否需要渲染。 - componentWillReceiveProps: 与update函数非常类似。 - componentDidMount: 我认为不存在与此相当的功能:组件要么存在且被渲染,要么不存在。这与将函数用作组件非常相似。

6
Elm不会自动检查输入是否发生了更改,它通过比对虚拟DOM来检查输出是否发生了更改。如果渲染代码本身很耗费资源,为了只在输入发生更改时运行视图函数,您需要使用Html.Lazy。详情请参见https://guide.elm-lang.org/optimization/lazy.html。 - glennsl
1
谢谢@glennsl,我把懒惰行为和普通行为混淆了。我已经相应地更新了我的答案。 - SolarBear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接