reactjs - 在功能 react 范式中如何跟踪 "frames"之间的对象?

标签 reactjs reactive-programming elm frp

我一直在研究 Elm、ReactJS 以及其他基于响应式(Reactive)/功能响应式(Reactive)范式的框架和语言。

我了解响应式(Reactive)编程如何工作的基础知识,以及为什么这样的系统可能有用。但我很难在脑海中概念化某些方面。

例如,我理解“查看”或“构建”功能的概念。在响应式 Web 框架中,我们编写一个函数来获取程序状态并返回表示显示的 HTML 元素列表。每次状态改变时,框架都会再次调用 View 函数并重建显示。这些框架很聪明,因为它们可以将新元素与旧元素进行比较,并以最少的调用有效地更新页面。

但是,我无法理解如何在调用 View 函数时跟踪元素,即框架知道新框架中的元素与旧框架中的元素相同。

为什么需要跟踪元素?因为,例如,GUI 渲染器可能想要播放动画来选中或取消选中某个框。如果框架调用 View 函数并在每次选中或取消选中某个框时重建显示,则 GUI 渲染器将无法知道该框不是从头开始创建的。因此,它将无法播放选中或取消选中动画。

考虑 Elm 的字段示例 http://elm-lang.org/examples/field 。当在字段中输入新字符时,将重建显示。将使用新状态再次创建文本框。从浏览器的角度来看,就好像旧的文本框被删除,并在其位置创建了一个新的文本框。

现在,我认为我的理解是错误的,文本框实际上并没有被删除。但我怎么能确定呢?响应式(Reactive)编程是否有可靠的逻辑来跟踪元素?

最佳答案

这是使用虚拟 DOM 解决的。构建 View 的虚拟版本并与当前版本进行比较,并且仅将更改实际提交到 DOM。如果虚拟 DOM 和实际 DOM 中存在具有某些特征的文本字段,则不会删除并重新创建它,而是将其保留下来,然后比较工具向下移动一个级别并检查内容和属性,依此类推。

这些是实现细节,您无需关心它们,但如果您想了解更多有关 diff 工作原理的信息,您可以阅读 Elm 的 VirtualDom 包 here

关于reactjs - 在功能 react 范式中如何跟踪 "frames"之间的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50193733/

相关文章:

javascript - 除了 render 方法之外,还有什么方法可以在 React 类中获取 props 吗?

reactive-programming - 响应式(Reactive)管道中的后台任务(即发即忘)

functional-programming - 如何在 Elm 0.15 中获得 keepWhen 行为?

reactjs - FieldValue 未定义

javascript - React - 尽管有默认值,但复选框值未定义

php - Laravel Sanctuary | react JS | SPA 授权问题

reactive-programming - Vertx 在 Quarkus vertx mutiny webclient 扩展中不可用

swift - 如何在带有 RxSwift 的驱动程序上使用 flatMapLatest

function - 如何在 Elm repl 中查找函数的类型

elm - 如何编写解码器来映射自定义数据类型的值列表?