gpt4 book ai didi

meteor - Meteor 的 react 性在幕后是如何运作的?

转载 作者:行者123 更新时间:2023-12-03 05:32:34 29 4
gpt4 key购买 nike

我已阅读 docs并查看了 source behind reactivity ,但我不明白。

有人可以解释一下它在幕后是如何工作的吗,因为它对我来说就像魔法:)。

最佳答案

所以它实际上相当简单,在基本层面上涉及两种类型的函数:

  1. 创建响应式上下文的函数(响应式函数)

  2. 使响应式上下文无效的函数(无效函数)

  3. 可以同时执行这两种操作的函数。 (我撒谎有3个)

当您调用reactive function时它创建了一个 context该 meteor 存储在全局范围内,并且 reactive function订阅invalidation打回来。您传递给响应式(Reactive)函数或从其中运行的任何函数的函数可以是 invalidating function并且可以抓取当前的context并将其存储在本地。这些函数可以随时(例如数据库更新或简单的计时器调用)使 context 失效。 。原文reactive function然后将接收该事件并重新评估自身。

这里是使用meteor函数的一步一步(注意 Tracker.autorun 曾经被称为 Deps.autorun ):

Tracker.autorun(function(){ 
alert("Hello " + Session.get("name"));
});

Session.set("name", "Greg");
  1. autorun 将函数作为参数
  2. 在 autorun 运行此函数之前,它会创建一个 context
  3. autorun 将回调附加到 context的失效事件
  4. 此回调将重新运行传递给 autorun 的函数
  5. 然后该函数在 context 中运行这是第一次。
  6. Meteor 存储此 context全局当前活跃的 context
  7. 该函数内部还有另一个函数:Session.get()
  8. Session.get() 既是 reactive function和一个invalidating function
  9. Session.get 设置它自己的 context并将其在内部与键“name”关联起来
  10. Session.get 从meteor全局检索当前上下文(自动运行的上下文)
  11. Session.get 注册到它自己的上下文的失效回调将简单地使其封闭的上下文(在本例中为自动运行的上下文)失效
  12. 现在我们有 2 个上下文,autorun 和 session.get
  13. 当这些函数返回时,meteor 会清理事件上下文全局变量

  14. Session.set 是另一个能够使 context 失效的函数。 .

  15. 在这种情况下,我们将使所有 context 失效。由与键“name”关联的 Session 创建
  16. 所有这些contexts ,当失效时,运行它们的失效回调。
  17. 这些回调只会使其封闭的 context 失效。 s (这是 Session.get 的设计,而不是失效回调必须执行的操作)
  18. 那些包含 contexts 的内容现在运行它们的失效回调。
  19. 在自动运行的情况下,该回调运行我们最初传递给自动运行的函数,然后设置 context再次。

整个实现实际上也相当简单,您可以在这里看到它:
https://github.com/meteor/meteor/blob/master/packages/tracker/tracker.js

可以在此处找到有关其工作原理的一个很好的示例:
https://github.com/meteor/meteor/blob/master/packages/reactive-dict/reactive-dict.js

响应式编程实际上并不是 meteor 或 JS 特有的
您可以在这里阅读:http://en.wikipedia.org/wiki/Reactive_programming

关于meteor - Meteor 的 react 性在幕后是如何运作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10260015/

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