写文章不容易,点个赞呗兄弟
专一 Vue 源码分享,文章分为白话版和 源码版,白话版助于理解工做原理,源码版助于了解内部详情,让咱们一块儿学习吧
研究基于 Vue版本 【2.5.17】
若是你以为排版难看,请点击 下面连接 或者 拉到 下面关注公众号也能够吧node
Vue 事件是我最感兴趣的东西之一,一直想研究玩玩学习
特别是组件自定义事件,很想知道,给子组件绑定自定义事件,子组件是怎么触发的 巴拉巴拉的this
开始正文了spa
在 Vue 中,事件大概分为 4 种3d
一、自定义事件对象
二、DOM 事件blog
三、组件DOM 事件事件
四、组件自定义事件rem
而后再细分,就只有两种
一、自定义事件
二、DOM 事件
下面就来粗略说一下事件
自定义事件 是使用观察者模式创建起来的一种事件机制
分为 我的使用 和 组件使用
自定义事件主要由下面两部分构成
一、有事件存储器
二、绑定事件,触发事件,解绑事件三个函数
在 Vue 中,每一个实例都会添加一个属性_events,用来存放本实例上注册的自定义事件
_events 就是 事件存储器,是一个对象
属性名是 事件名,属性值是事件回调
我也常常在项目中使用到 自定义事件,像下面这样
没错,$on 就是注册事件,$emit 是 触发事件,$off 就是 解绑事件
在哪一个实例上注册的事件,事件就属于哪一个实例,正常状况下,你是不可能能触发别的实例上的事件的
而给组件绑定自定义事件 是怎么样的呢?
结果也是同样的,前面的解析处理能够无论,最后一样是使用内置的 $on 方法去注册事件
而这个事件依然是属于子组件的,存放在 子组件的 _events 中
因此你能够在子组件中,使用 this.$emit 触发这个事件
DOM 事件,最后就是直接给 DOM 绑定事件
使用 addEventListeners 绑定事件,没有作任何兼容处理,灰常简单
绑定事件,是在DOM 建立以后,插入页面以前
很简单,普通 addEventListener 绑定DOM事件就完事了
事件会被保存在这个节点解析成的 vnode 中,就是 vm._vnode
若是要给组件绑定原生DOM 事件,须要加上 native 这个修饰器
组件绑定的DOM 事件,在父实例解析完毕开始挂载时,遇到子元素是组件,而后去解析组件内部并生成DOM以后才 addEventListener 绑定
绑定的原生事件,会被存放在组件的外壳节点上 vm.$vnode
还有,你可能会想,若是这样绑定DOM事件会怎么样?
问得好,这样并不会绑定DOM事件,而是给组件绑定自定义事件,最后是会存在 子组件的 _events 中的,并不会绑定DOM事件
而后能够在子组件中用 this.$emit("click") 去触发这个父组件绑定的这个click