events.js 2.0 KB

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