vue.js 原始碼學習筆記 ----- codegenEvents.js

來源:互聯網
上載者:User

標籤:odi   ast   sel   bool   ace   turn   custom   else   原始碼   

/* @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 aliasesconst 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  )}

 

vue.js 原始碼學習筆記 ----- codegenEvents.js

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.