vue.js 源代码学习笔记 ----- codegenEvents.js
2024-10-09 19:31:08
/* @flow */ const fnExpRE = /^\s*([\w$_]+|\([^)]*?\))\s*=>|^function\s*\(/
const simplePathRE = /^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?']|\[".*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*\s*$/ // keyCode aliases
const keyCodes = {
esc: 27,
tab: 9,
enter: 13,
space: 32,
up: 38,
left: 37,
right: 39,
down: 40,
'delete': [8, 46]
} const modifierCode = {
stop: '$event.stopPropagation();',
prevent: '$event.preventDefault();',
self: 'if($event.target !== $event.currentTarget)return;'
} const isMouseEventRE = /^mouse|^pointer|^(click|dblclick|contextmenu|wheel)$/
const mouseEventModifierCode = {
ctrl: 'if(!$event.ctrlKey)return;',
shift: 'if(!$event.shiftKey)return;',
alt: 'if(!$event.altKey)return;',
meta: 'if(!$event.metaKey)return;'
} export function genHandlers (events: ASTElementHandlers, native?: boolean): string {
let res = native ? 'nativeOn:{' : 'on:{'
for (const name in events) {
res += `"${name}":${genHandler(name, events[name])},`
}
return res.slice(0, -1) + '}'
} function genHandler (
name: string,
handler: ASTElementHandler | Array<ASTElementHandler>
): string {
if (!handler) {
return 'function(){}'
} else if (Array.isArray(handler)) {
return `[${handler.map(handler => genHandler(name, handler)).join(',')}]`
} else if (!handler.modifiers) {
return fnExpRE.test(handler.value) || simplePathRE.test(handler.value)
? handler.value
: `function($event){${handler.value}}`
} else {
let code = ''
const keys = []
const isMouseEvnet = isMouseEventRE.test(name)
for (const key in handler.modifiers) {
if (modifierCode[key]) {
code += modifierCode[key]
} else if (isMouseEvnet && mouseEventModifierCode[key]) {
code += mouseEventModifierCode[key]
} else {
keys.push(key)
}
}
if (keys.length) {
code = genKeyFilter(keys) + code
}
const handlerCode = simplePathRE.test(handler.value)
? handler.value + '($event)'
: handler.value
return 'function($event){' + code + handlerCode + '}'
}
} function genKeyFilter (keys: Array<string>): string {
const code = keys.length === 1
? normalizeKeyCode(keys[0])
: Array.prototype.concat.apply([], keys.map(normalizeKeyCode))
if (Array.isArray(code)) {
return `if(${code.map(c => `$event.keyCode!==${c}`).join('&&')})return;`
} else {
return `if($event.keyCode!==${code})return;`
}
} function normalizeKeyCode (key) {
return (
parseInt(key, 10) || // number keyCode
keyCodes[key] || // built-in alias
`_k(${JSON.stringify(key)})` // custom alias
)
}
最新文章
- Android使用静默安装时碰见的问题
- Java三大框架之——Hibernate
- ppmoney
- JavaWeb笔记——JSTL标签
- easyui-dialog中文件上传处理
- 【hadoop代码笔记】Mapreduce shuffle过程之Map输出过程
- python3之序列化(pickle&;json&;shelve)
- Codeforces 768A Oath of the Night&#39;s Watch
- Problem : (1.2.1) Text Reverse
- Jvm垃圾回收器(终结篇)
- MDK5报错missing closing quote
- 一起学习造轮子(二):从零开始写一个Redux
- BIM 3D 数据交换格式 ----张建平(清华女)
- 线性判别分析(Linear Discriminant Analysis, LDA)算法分析
- 获取FirefoxProfile配置文件以及使用方法介绍
- ubuntu13.10更换源
- Iterator 和 Iterable 区别和联系
- docker微服务部署之:三,搭建Zuul微服务项目
- Unity 游戏框架搭建 (八) 减少加班利器-QLog
- Ubuntu 16.04.5下FFmpeg编译与开发环境搭建