vue中wath的源码实现
前言
阅读本节,需要理解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的源码实现相关推荐
- element 往node里面增加属性值_【Vue原理】Compile - 源码版 之 Parse 属性解析
写文章不容易,点个赞呗兄弟 专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本 [2.5.17] 如果你觉得排版难 ...
- 初始化触发点击事件_【Vue原理】Event - 源码版 之 自定义事件
专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本[2.5.17] Vue 的自定义事件很简单,就是使用 观察者模 ...
- elementui组件_elementui 中 loading 组件源码解析(续)
上一篇我们说了elementui如何将loading组件添加到 Vue 实例上,具体内容见上期 elementui 中 loading 组件源码解析. 这一篇我们开始讲讲自定义指令 自定义指令 关于自 ...
- elementui table某一列是否显示_elementui 中 loading 组件源码解析(续)
上一篇我们说了elementui如何将loading组件添加到 Vue 实例上,具体内容见上期 elementui 中 loading 组件源码解析. 这一篇我们开始讲讲自定义指令 自定义指令 关于自 ...
- 【Vue原理】Diff - 源码版 之 Diff 流程
写文章不容易,点个赞呗兄弟 专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本 [2.5.17] 如果你觉得排版难 ...
- Springboot+vue在线考试系统源码,前后端分离
Springboot+vue在线考试系统源码 开发语言:Java 数据库:Mysql 开发工具:Eclipse 使用技术: 后端:SpringBoot 前端:VUE 和 Element-UI 源码免费 ...
- vue使用computed有参数_【Vue原理】Computed - 源码版
专注 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工作原理,源码版助于了解内部详情,让我们一起学习吧 研究基于 Vue版本2.5.17 今天要记录 computed 的源码,有时候想,理 ...
- 通过vue实现在线直播源码的直播点赞
我们可以发现,在线直播源码的直播间中,在右下角会有给主播点赞的按钮,点赞越多,对主播来说好处越多,那么在线直播源码是怎么实现点赞功能的呢? 实现在线直播源码观众的点赞功能. 功能描述:最后一次点赞三秒 ...
- Eclipse中导入第三方源码的问题和备用解决方案
Eclipse中导入第三方源码的问题和备用解决方案 参考文章: (1)Eclipse中导入第三方源码的问题和备用解决方案 (2)https://www.cnblogs.com/fjdingsd/p/4 ...
最新文章
- 错误 - 无法访问IIS元数据库
- mysql connect by_Mysql主从库搭建
- 同级子目录下重新设置属性失效
- redis rua解决库存问题_【150期】面试官:Redis的各项功能解决了哪些问题?
- 使用机器视觉模式识别屏幕
- C语言之字符串探究(六):sprintf——把格式化的数据写入某个字符缓冲区
- 谷歌发布 V8 Exploit 漏洞奖励计划,奖金加倍
- 教你CentOS7部署TOMCAT8
- 定位日站大法之-社会工程学
- 利用python爬虫进行彼岸网图库图片的抓取(bs4)
- 存用部首查字典如何查_存的部首,存的偏旁部首,存的拼音,存的笔画数,存的组词,存的意思...
- haproxy配置timeout
- 高中3年,3500个词汇带音标,归成“图表”
- VS2015专业版打开处于白屏状态
- matlab稳定性实验分析,实验 控制系统稳定性分析的MATLAB实现
- HP路由器和交换机日志分析
- 合一算法的Python实现--人工智能
- JAVA 处理百万或者千万数据的方法
- World一页打印变成两页怎么缩放
- 《数字图像处理 冈萨雷斯》绪论——学习笔记
热门文章
- SylixOS快问快答
- 电力系统潮流程序C语言,电力系统潮流C语音程
- cad隐藏图层命令快捷键_Auto CAD如何隐藏全部图层,快捷键是什么?
- 流媒体选择Nginx是福还是祸?
- pta 7-2 jmu-python-组合数 (20 分) python函数练习
- APP开发:线上教育APP盈利模式分析
- Ural 2045. Richness of words 打表找规律
- w ndows无法连接到System,Windows无法连接到System Event Notification Service 服务
- 好用的oier命令行工具(自创的)
- 对webkit-font-smoothing和-moz-osx-font-smoothing的理解