【vueJs源码】阅读之vm.$watch函数

news/2024/7/8 8:46:49

我们经常使用watch肯定知道它,他和computer一样都是数据发生变化都会触发它。今天我们就来了解一下它的原理。

他的用法

Vue.prototype.$watch = function (
    expOrFn: string | (() => any),
    cb: any,
    options?: Record<string, any>
): Function

这是vuejs源码定义,第一个参数是一个表达式,表示要观察的表达式,或者couputed函数在vuejs实例上的变化。

第二个参数是一个回调函数,调用时会从参数得到新数据(new value)和旧数据(old value)。

第三个参数接受一个对象里面可以传deep或者immediate。deep时为了发现对象内部值的变化,可以在参数指定deep:true。不过注意,监听数组变动不需要。
immediate:设置它为true,将立即以表达式当前值触发回调。而不是等到数据变化才触发回调。

vm.$watch返回一个取消观察函数,用来停止触发回调:

var unwatch = vm.$watch('a', (newVal, oldVal) => {});
unwatch() // 之后取消观察

watch的内部原理

vm. w a t c h 是对 W a t c h e r 的一种封装,通过 w a t c h e r 实现 v m . watch是对Watcher的一种封装,通过watcher实现vm. watch是对Watcher的一种封装,通过watcher实现vm.watch的功能。

但vm.$watch中的参数deep和immeditae是watcher中所没有的。

Vue.prototype.$watch = function (
    expOrFn: string | (() => any),
    cb: any,
    options?: Record<string, any>
  ): Function {
    const vm: Component = this
    if (isPlainObject(cb)) {
      return createWatcher(vm, expOrFn, cb, options)
    }
    options = options || {}
    options.user = true
    const watcher = new Watcher(vm, expOrFn, cb, options)
    if (options.immediate) {
      const info = `callback for immediate watcher "${watcher.expression}"`
      pushTarget()
      invokeWithErrorHandling(cb, vm, [watcher.value], vm, info)
      popTarget()
    }
    return function unwatchFn() {
      watcher.teardown()
    }
  }

这是watch的源码。先执行new Watcher来实现vm.$watch的基本功能。

执行完new Wathcer之后,代码判断是否使用immediate参数。如果使用了则立即实行一次cb。

最后,执行一个函数unwatchFn,用来取消观察数据。

实际是执行了teardown()来取消观察数据。是把watcher实例从当前正在观察的状态的依赖列表中移除。


http://www.niftyadmin.cn/n/4820376.html

相关文章

Common Lisp

Common Lisp 来自 维客 Jump to: navigation, searchCommon Lisp&#xff0c;一般缩写为 CL&#xff08;不要和缩写同为CL的組合邏輯混淆&#xff09;&#xff0c;是Lisp的方言&#xff0c;标准由ANSI X3.226-1994定义。它是为了标准化此前众多的Lisp分支而开发的&#xff0c;它…

qa qc qm的区别

稍后更新。。。转载于:https://www.cnblogs.com/Chamberlain/p/10586562.html

python --web服务器

用python建立简单的web服务器 利用Python自带的包可以建立简单的web服务器。 在DOS里cd到准备做服务器根目录的路径下&#xff0c;输入命令&#xff1a; python -m Web服务器模块 [端口号&#xff0c;默认8000] 例如&#xff1a; python -m SimpleHTTPServer 8080 然后就…

几个免费的Scheme(Lisp)解释器

几个免费的Scheme&#xff08;Lisp&#xff09;解释器关键字: lisp schemeLisp 是一个古老的函数式编程语言&#xff0c;Scheme则起源于MIT的一种Lisp方言。当前编程语言的一些特性&#xff0c;如尾递归、匿名函数、动态改变代码的功能等等&#xff0c;不 少是受到了Lisp的启发…

终极秘密---------windows里藏着9.11的惊天大密码

终极秘密---------windows里藏着9.11的惊天大密码 神秘连锁"密码"泄漏恐怖分子袭美玄机 方法:用WORD~~~编辑文档输入Q33NY(必须大写) (这是9.11撞击世界贸易中心的沙特勇士们乘坐的航班号); 第三,将字体大小改到72; 最后,将字体转成 wingdings字体.你看到…

C# 印刷文字识别-身份证识别

1.阿里免费提供500次识别。需要购买该产品。 2.产品购买成功后&#xff0c;获取appcode值&#xff0c;这个要放代码中的appcode中。 3.识别的图片路径 public static void Main(string[] args){//身份证识别// Console.WriteLine("Hello World!");String url "…

Linux上的集成开发环境收藏

Linux上的集成开发环境收藏 新一篇: Linux下C语言编程基础知识 | 旧一篇: 实现千万级数据分页的存储过程&#xff01; <script>function StorePage(){ddocument;td.selection?(d.selection.type!None?d.selection.createRange().text:):(d.getSelection?d.getSelectio…

Visual C++界面常用控件技巧实例

http://www.chinabyte.com/SoftChannel/72348977504190464/20040717/1832043.shtml