没有合适的资源?快使用搜索试试~ 我知道了~
阿里云技术团队偏前端技术
资源推荐
资源详情
资源评论





偏前端技术

目录
偏前端技术 1
$emit, $on实现原理剖析,快动手写一个eventBus吧 2
D8调试工具——jsvu的使用细则 8
GitHub主页美化教程——不一样的主页,更精彩 20
Less混合结合:nth-child()选择器的高级玩法 31
V8中的快慢属性(图文分解更易理解) 33
V8中的快慢数组(附源码、图文更易理解) 50
js获取项目git分支信息 64
less变量以及循环输出对变量的引用 67
npm 脚本命令使用解析 70
vue项目启动失败,内存不足处理 73
博客园美化 78
博客园美化 86
卡片布局以及鼠标悬浮展示全部 94
多路径来源页面导航高亮以及面包屑导航修改 98
多路由复用页面组件问题 100
封装监听事件—链式调用 103
布局之悬浮显示更多文本并增加箭头指示效果 105
来,体会一下npm包的发布、更新管理、使用——完整教程 109
认识Chrome扩展插件 115
认识Vue扩展插件 121
记一个“奇葩”需求的实现 124
设计模式 128

$emit, $on实现原理剖析,快动手写一个eventBus吧
1、先贴一下源码
1.1核心代码实现
源码位置: src/core/instance/events.js
代码有删减
/* @flow */
{import
tip,
toArray,
hyphenate,
formatComponentName,
invokeWithErrorHandling
} from '../util/index'
// ...
( : < >) {export function eventsMixin Vue Class Component
hookRE = const /^hook:/
. . = ( ): Vue prototype $on function event: string | <string>, fn: Array Function Compon
{ent
: = const vm Component this
( . (event)) {if Array isArray
( i = , l = event. ; i < l; i++) {for let 0 length
vm.$on(event[i], fn)
}
} {else
(vm. [event] || (vm. [event] = [])). (fn)_events _events push
// optimize hook:event cost by using a boolean flag marked at registration
// instead of a hash lookup
(hookRE. (event)) {if test
vm. = _hasHookEvent true
}
}
vmreturn
}
. . = ( ): {Vue prototype $once function event: string, fn: Function Component
: = const vm Component this
() {function on
vm.$off(event, on)
fn. (vm, )apply arguments
}
on. = fnfn
vm.$on(event, on)
vmreturn
$emit, $on实现原理剖析,快动手写一个eventBus吧
第 1 页 /共
129 页

}
. . = ( ): Vue prototype $off function event?: string | <string>, fn?: Array Function Com
{ponent
: = const vm Component this
// all
(! . ) {if arguments length
vm. = . ( )_events Object create null
vmreturn
}
// array of events
( . (event)) {if Array isArray
( i = , l = event. ; i < l; i++) {for let 0 length
vm.$off(event[i], fn)
}
vmreturn
}
// specific event
cbs = vm. [event]const _events
(!cbs) {if
vmreturn
}
(!fn) {if
vm. [event] = _events null
vmreturn
}
// specific handler
cblet
i = cbs.let length
(i--) {while
cb = cbs[i]
(cb === fn || cb. === fn) {if fn
cbs. (i, )splice 1
break
}
}
vmreturn
}
. . = ( ): {Vue prototype $emit function event: string Component
: = const vm Component this
(process. . !== ) {if env NODE_ENV 'production'
lowerCaseEvent = event. ()const toLowerCase
(lowerCaseEvent !== event && vm. [lowerCaseEvent]) {if _events
(tip
+`Event " " is emitted in component `${lowerCaseEvent}
` but the handler is registered for " ". ${formatComponentName(vm)} ${event}
+`
+`Note that HTML attributes are case-insensitive and you cannot use `
+`v-on to listen to camelCase events when using in-DOM templates. `
`You should probably use " " instead of " ".`${hyphenate(event)} ${event}
)
}
}
cbs = vm. [event]let _events
$emit, $on实现原理剖析,快动手写一个eventBus吧
第 2 页 /共
129 页

1.
2.
3.
(cbs) {if
cbs = cbs. > ? (cbs) : cbslength 1 toArray
args = ( , )const toArray arguments 1
info = const `event handler for " "`${event}
( i = , l = cbs. ; i < l; i++) {for let 0 length
(cbs[i], vm, args, vm, info)invokeWithErrorHandling
}
}
vmreturn
}
}
1.2、invokeWithErrorHandling 方法实现
下面看一下 的实现逻辑invokeWithErrorHandling
源码位置: src\core\util\error.js
(export function invokeWithErrorHandling
: ,handler Function
: any,context
: | any[],args null
: any,vm
: stringinfo
) {
reslet
{try
res = args ? handler. (context, args) : handler. (context)apply call
(res && !res. && (res) && !res. ) {if _isVue isPromise _handled
res. ( (e, vm, info + ))catch =>e handleError ` (Promise/async)`
// issue #9511
// avoid catch triggering multiple times when nested calls
res. = _handled true
}
} (e) {catch
(e, vm, info)handleError
}
resreturn
}
1.3、分析
Vue 的数据相应是依赖于“ ”模式, emit也是基于这种模式发布-订阅 o n 、 on、 on、
$on 用来收集所有的事件依赖,他会将传入的参数event和fn作为key和value的形式存到vm.
_events这个事件集合里,就像这样vm._events[event]=[fn]。以便于emit的时候,取出vm.
_events中存储的方法,调用执行
$emit 是用来触发事件的,他会根据传入的event在vm_events中找到对应的事件(vm._events
[event]),并执行invokeWithErrorHandling(cbs[i], vm, args, vm, info)
$emit, $on实现原理剖析,快动手写一个eventBus吧
第 3 页 /共
129 页
剩余130页未读,继续阅读
资源评论


kbv516
- 粉丝: 0
- 资源: 35
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


安全验证
文档复制为VIP权益,开通VIP直接复制
