前言

阅读本节,需要理解vue的数据驱动原理。

看这样一段代码

new Vue({data: {msg: 'hello',say: 'hello world',},watch: {msg(newVal) {this.say = newVal + ' world';}}
})

vue的data包括2个属性msg和say,watch中监听msg并更新say的值。

源码实现

1. new Vue

function Vue (options) {if ("development" !== 'production' &&!(this instanceof Vue)) {warn('Vue is a constructor and should be called with the `new` keyword');}this._init(options);
}

new Vue会执行原型上的_init方法, _init方法中hi调用 initState,这个方法会初始化所有状态相关内容

2. initWatch

initStatus会判断如果我们定义了watch则执行initWatch

function initWatch (vm, watch) {for (var key in watch) {var handler = watch[key];if (Array.isArray(handler)) {for (var i = 0; i < handler.length; i++) {createWatcher(vm, key, handler[i]);}} else {  createWatcher(vm, key, handler);}}
}

这段代码意思是如果watch声明了一个数组,则遍历数组并调用createWatcher,如果不是数组就直接调用createWatcher传递过去。这就证明,watch我们可以声明多个处理函数。

3. createWatcher

createWatcher主要工作是处理传入值,传入不同的值,做不同的兼容处理

function createWatcher (vm,expOrFn,handler,options
) {// 如果handler是对象,则获取handler下面的handler属性当作watch的执行函数if (isPlainObject(handler)) {options = handler;handler = handler.handler;}
// 如果handler是字符串,则获取vue原型上的方法if (typeof handler === 'string') {handler = vm[handler];}
// 调用vue原型上的$watchreturn vm.$watch(expOrFn, handler, options)
}

通过以上我们可以看出,watch定义有很多种类型,比如:

new Vue({watch: {// 字符串test1: 'handleTest',// 对象
        test2: {handler(newVal) {// ....
            }}},methods: {handleTest(newVal) {// ...
        }}
})

4. vm.$watch

Vue.prototype.$watch = function (expOrFn,cb,options
) {var vm = this;if (isPlainObject(cb)) {return createWatcher(vm, expOrFn, cb, options)}options = options || {};options.user = true;// new 一个Watcher实例var watcher = new Watcher(vm, expOrFn, cb, options);if (options.immediate) {cb.call(vm, watcher.value);}return function unwatchFn() {watcher.teardown();}
};

通过以上代码可以看出,watch的创建最终其实是vue内部创建了一个Watcher实例。那么Watcher是vue中很重要的一部分,它是数据驱动不可缺少的一部分。

接下来大概讲一下new Watcher的功能是什么样的。

5. new Watcher

vue在拿到了要监听的属性和属性更新执行的函数后,new Watcher创建一个Watcher。

Watcher是订阅者,它“监听更新行为”并执行更新函数。

为什么双引号?其实不是它在监听。以最初的代码为例更新步骤如下:

1. vue内部new Watcher创建一个Watcher实例

2. Watcher实例创建时会将自己添加到data.msg的Observer中(数据驱动原理知识)

3. 当我们改变msg值时,msg Observer会通知所有被观察者,其中就包括以上Watcher。(数据驱动原理知识)

4. Watcher触发更新并且执行回调,因此执行了我们声明的函数。

完结

watch的实现很简单,这里需要vue的数据驱动原理,由Object.defileProperty、Dep、Watcher几部分实现。不了解的可以先去学习这部分内容。

转载于:https://www.cnblogs.com/xujiazheng/p/11023356.html

vue中wath的源码实现相关推荐

  1. element 往node里面增加属性值_【Vue原理】Compile - 源码版 之 Parse 属性解析

    写文章不容易,点个赞呗兄弟 专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本 [2.5.17] 如果你觉得排版难 ...

  2. 初始化触发点击事件_【Vue原理】Event - 源码版 之 自定义事件

    专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本[2.5.17] Vue 的自定义事件很简单,就是使用 观察者模 ...

  3. elementui组件_elementui 中 loading 组件源码解析(续)

    上一篇我们说了elementui如何将loading组件添加到 Vue 实例上,具体内容见上期 elementui 中 loading 组件源码解析. 这一篇我们开始讲讲自定义指令 自定义指令 关于自 ...

  4. elementui table某一列是否显示_elementui 中 loading 组件源码解析(续)

    上一篇我们说了elementui如何将loading组件添加到 Vue 实例上,具体内容见上期 elementui 中 loading 组件源码解析. 这一篇我们开始讲讲自定义指令 自定义指令 关于自 ...

  5. 【Vue原理】Diff - 源码版 之 Diff 流程

    写文章不容易,点个赞呗兄弟 专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本 [2.5.17] 如果你觉得排版难 ...

  6. Springboot+vue在线考试系统源码,前后端分离

    Springboot+vue在线考试系统源码 开发语言:Java 数据库:Mysql 开发工具:Eclipse 使用技术: 后端:SpringBoot 前端:VUE 和 Element-UI 源码免费 ...

  7. vue使用computed有参数_【Vue原理】Computed - 源码版

    专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本2.5.17 今天要记录 computed 的源码,有时候想,理 ...

  8. 通过vue实现在线直播源码的直播点赞

    我们可以发现,在线直播源码的直播间中,在右下角会有给主播点赞的按钮,点赞越多,对主播来说好处越多,那么在线直播源码是怎么实现点赞功能的呢? 实现在线直播源码观众的点赞功能. 功能描述:最后一次点赞三秒 ...

  9. Eclipse中导入第三方源码的问题和备用解决方案

    Eclipse中导入第三方源码的问题和备用解决方案 参考文章: (1)Eclipse中导入第三方源码的问题和备用解决方案 (2)https://www.cnblogs.com/fjdingsd/p/4 ...

最新文章

  1. 错误 - 无法访问IIS元数据库
  2. mysql connect by_Mysql主从库搭建
  3. 同级子目录下重新设置属性失效
  4. redis rua解决库存问题_【150期】面试官:Redis的各项功能解决了哪些问题?
  5. 使用机器视觉模式识别屏幕
  6. C语言之字符串探究(六):sprintf——把格式化的数据写入某个字符缓冲区
  7. 谷歌发布 V8 Exploit 漏洞奖励计划,奖金加倍
  8. 教你CentOS7部署TOMCAT8
  9. 定位日站大法之-社会工程学
  10. 利用python爬虫进行彼岸网图库图片的抓取(bs4)
  11. 存用部首查字典如何查_存的部首,存的偏旁部首,存的拼音,存的笔画数,存的组词,存的意思...
  12. haproxy配置timeout
  13. 高中3年,3500个词汇带音标,归成“图表”
  14. VS2015专业版打开处于白屏状态
  15. matlab稳定性实验分析,实验 控制系统稳定性分析的MATLAB实现
  16. HP路由器和交换机日志分析
  17. 合一算法的Python实现--人工智能
  18. JAVA 处理百万或者千万数据的方法
  19. World一页打印变成两页怎么缩放
  20. 《数字图像处理 冈萨雷斯》绪论——学习笔记

热门文章

  1. SylixOS快问快答
  2. 电力系统潮流程序C语言,电力系统潮流C语音程
  3. cad隐藏图层命令快捷键_Auto CAD如何隐藏全部图层,快捷键是什么?
  4. 流媒体选择Nginx是福还是祸?
  5. pta 7-2 jmu-python-组合数 (20 分) python函数练习
  6. APP开发:线上教育APP盈利模式分析
  7. Ural 2045. Richness of words 打表找规律
  8. w ndows无法连接到System,Windows无法连接到System Event Notification Service 服务
  9. 好用的oier命令行工具(自创的)
  10. 对webkit-font-smoothing和-moz-osx-font-smoothing的理解