1. /* @flow */
  2.  
  3. const fnExpRE = /^\s*([\w$_]+|\([^)]*?\))\s*=>|^function\s*\(/
  4. const simplePathRE = /^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?']|\[".*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*\s*$/
  5.  
  6. // keyCode aliases
  7. const keyCodes = {
  8. esc: 27,
  9. tab: 9,
  10. enter: 13,
  11. space: 32,
  12. up: 38,
  13. left: 37,
  14. right: 39,
  15. down: 40,
  16. 'delete': [8, 46]
  17. }
  18.  
  19. const modifierCode = {
  20. stop: '$event.stopPropagation();',
  21. prevent: '$event.preventDefault();',
  22. self: 'if($event.target !== $event.currentTarget)return;'
  23. }
  24.  
  25. const isMouseEventRE = /^mouse|^pointer|^(click|dblclick|contextmenu|wheel)$/
  26. const mouseEventModifierCode = {
  27. ctrl: 'if(!$event.ctrlKey)return;',
  28. shift: 'if(!$event.shiftKey)return;',
  29. alt: 'if(!$event.altKey)return;',
  30. meta: 'if(!$event.metaKey)return;'
  31. }
  32.  
  33. export function genHandlers (events: ASTElementHandlers, native?: boolean): string {
  34. let res = native ? 'nativeOn:{' : 'on:{'
  35. for (const name in events) {
  36. res += `"${name}":${genHandler(name, events[name])},`
  37. }
  38. return res.slice(0, -1) + '}'
  39. }
  40.  
  41. function genHandler (
  42. name: string,
  43. handler: ASTElementHandler | Array<ASTElementHandler>
  44. ): string {
  45. if (!handler) {
  46. return 'function(){}'
  47. } else if (Array.isArray(handler)) {
  48. return `[${handler.map(handler => genHandler(name, handler)).join(',')}]`
  49. } else if (!handler.modifiers) {
  50. return fnExpRE.test(handler.value) || simplePathRE.test(handler.value)
  51. ? handler.value
  52. : `function($event){${handler.value}}`
  53. } else {
  54. let code = ''
  55. const keys = []
  56. const isMouseEvnet = isMouseEventRE.test(name)
  57. for (const key in handler.modifiers) {
  58. if (modifierCode[key]) {
  59. code += modifierCode[key]
  60. } else if (isMouseEvnet && mouseEventModifierCode[key]) {
  61. code += mouseEventModifierCode[key]
  62. } else {
  63. keys.push(key)
  64. }
  65. }
  66. if (keys.length) {
  67. code = genKeyFilter(keys) + code
  68. }
  69. const handlerCode = simplePathRE.test(handler.value)
  70. ? handler.value + '($event)'
  71. : handler.value
  72. return 'function($event){' + code + handlerCode + '}'
  73. }
  74. }
  75.  
  76. function genKeyFilter (keys: Array<string>): string {
  77. const code = keys.length === 1
  78. ? normalizeKeyCode(keys[0])
  79. : Array.prototype.concat.apply([], keys.map(normalizeKeyCode))
  80. if (Array.isArray(code)) {
  81. return `if(${code.map(c => `$event.keyCode!==${c}`).join('&&')})return;`
  82. } else {
  83. return `if($event.keyCode!==${code})return;`
  84. }
  85. }
  86.  
  87. function normalizeKeyCode (key) {
  88. return (
  89. parseInt(key, 10) || // number keyCode
  90. keyCodes[key] || // built-in alias
  91. `_k(${JSON.stringify(key)})` // custom alias
  92. )
  93. }

vue.js 源代码学习笔记 ----- codegenEvents.js的更多相关文章

  1. vue.js 源代码学习笔记 ----- html-parse.js

    /** * Not type-checking this file because it's mostly vendor code. */ /*! * HTML Parser By John Resi ...

  2. vue.js 源代码学习笔记 ----- helpers.js

    /* @flow */ import { parseFilters } from './parser/filter-parser' export function baseWarn (msg: str ...

  3. vue.js 源代码学习笔记 ----- codegen.js

    /* @flow */ import { genHandlers } from './events' import { baseWarn, pluckModuleFunction } from '.. ...

  4. vue.js 源代码学习笔记 ----- fillter-parse.js

    /* @flow */ export function parseFilters (exp: string): string { let inSingle = false let inDouble = ...

  5. vue.js 源代码学习笔记 ----- text-parse.js

    /* @flow */ import { cached } from 'shared/util' import { parseFilters } from './filter-parser' //找到 ...

  6. vue.js 源代码学习笔记 ----- 工具方法 lang

    /* @flow */ // Object.freeze 使得这个对象不能增加属性, 修改属性, 这样就保证了这个对象在任何时候都是空的 export const emptyObject = Obje ...

  7. vue.js 源代码学习笔记 ----- 工具方法 env

    /* @flow */ /* globals MutationObserver */ import { noop } from 'shared/util' // can we use __proto_ ...

  8. vue.js 源代码学习笔记 ----- 工具方法 share

    /* @flow */ /** * Convert a value to a string that is actually rendered. { .. } [ .. ] 2 => '' */ ...

  9. vue.js 源代码学习笔记 ----- instance render

    /* @flow */ import { warn, nextTick, toNumber, _toString, looseEqual, emptyObject, handleError, loos ...

随机推荐

  1. drawable转mitmap 以及图片base64编码

    static Bitmap drawableToBitmap(Drawable drawable) // drawable 转换成bitmap { int width = drawable.getIn ...

  2. 【开发者笔记】C#连接mysql问题记录

    1.概述:C#在调用mysql.data.dll连接本地数据库时报错,连接远程Linux服务器上的mysql服务器正常 2.报错记录,当前连接字符串 <add key="dbStrin ...

  3. Flask系列之自定义中间件

    from flask import Flask app = Flask(__name__) @app.route('/index') def index(): return 'Hello World' ...

  4. Openstack(六)RabbitMQ集群

    各组件通过消息发送与接收是实现组件之间的通信: 6.1安装RabbitMQ 6.1.1安装RabbitMQ # yum install rabbitmq-server –y # systemctl s ...

  5. Educational Codeforces Round 55 (Rated for Div. 2) Solution

    A. Vasya and Book Solved. 三种方式取$Min$ #include <bits/stdc++.h> using namespace std; #define ll ...

  6. CCPC 2016-2017, Finals Solution

    A - The Third Cup is Free 水. #include<bits/stdc++.h> using namespace std; ; int n; int arr[max ...

  7. 打开 EXCEL时出现RUN-TIME ERROR“91”,怎么解决?

    方法一: 开始—程序—microsoft—打开“windows office 2007 简易设置”,把“使用 office 03样式经典菜单”前的“√”去掉就OK了 方法二: 1. 打开注册表编辑器. ...

  8. mysql日期和JDBC查询出来的结果相差8小时

    数据库时间:2017-11-08 16:30:00 查询出来: 2017-11-09 00:30:00 问题:数据库时区,和JDBC连接时区设置问题. set global time_zone = ' ...

  9. 20145325张梓靖 《Java程序设计》第2周学习总结

    20145325张梓靖 <Java程序设计>第2周学习总结 教材学习内容总结 整数 short 2字节,int 4字节,long 8字节 字节 byte 1字节 浮点数 float 4字节 ...

  10. 20162314 《Program Design & Data Structures》Learning Summary Of The Eighth Week

    20162314 2017-2018-1 <Program Design & Data Structures>Learning Summary Of The Eighth Week ...