编译和生成代码
- parse的时候添加属性, generate的时候处理属性
编译
- 在编译标签时
handleStartTag->processElement->processAttrs
会去解析事件绑定属性 addHandler
在ast上添加事件属性nativeEvents/events,events[name] = newHandler
|
|
|
|
生成代码
- generate.genElement.genData.genHandlers
- 对Handler判断是表达式还是方法名, 方法名直接返回, 表达式外面套个function
function($event){(handler.value)}
, 并传入$event
- 有modifier通过modifierCode添加对应的代码后和上一步一起返回.
- 对Handler判断是表达式还是方法名, 方法名直接返回, 表达式外面套个function
|
|
dom事件
- create / update hook事件绑定更新
- event hooks 安装和调用
- modules在
src/platforms/web/runtime/modules
. - events的create和update都是调用
updateDOMListeners
, create时oldVnode是空 - invokeCreateHooks调用create, patchVnode里调用update hook
- invokeCreateHooks在
createElm, initComponent
中调用,vue实例化和初始化组件时1234567891011121314151617181920212223242526var events = {create: updateDOMListeners,update: updateDOMListeners}var platformModules = [attrs, klass, events, domProps, style, transition]var modules = platformModules.concat(baseModules);var patch = createPatchFunction({ nodeOps: nodeOps, modules: modules });function createPatchFunction (backend) { // hooks在创建patch方法混入var i, j;var cbs = {}; // 平台module和basemodule都保存在cbs, 组件update的时候调用var modules = backend.modules;for (i = 0; i < hooks.length; ++i) {cbs[hooks[i]] = [];for (j = 0; j < modules.length; ++j) {if (isDef(modules[j][hooks[i]])) {cbs[hooks[i]].push(modules[j][hooks[i]]);}}}}
- invokeCreateHooks在
- modules在
|
|
- 调用hook
|
|
dom事件绑定
|
|
自定义事件
- 父组件render的时候发现child是组件, 有非native listener就作为componentOptions传入new Vnode(组件占位符节点)
- 子组件初始化时调用
initInternalComponent
initEvents
, 把vm.$options._parentListeners
里的listener传给updateListeners做dom事件类似的更新监听. - componentListener的add和remove方法调用
vm.$on $off
方法 - vm._events上有各类型的事件监听, 通过发布订阅模式实现事件回调
- 子组件update的时候监听native listener.
- 子组件初始化时调用
- 父组件update的时候监听native listener.
|
|
|
|
|
|
|
|