vue.js 源代码学习笔记 ----- codegenEvents.js
- /* @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
- )
- }
vue.js 源代码学习笔记 ----- codegenEvents.js的更多相关文章
- vue.js 源代码学习笔记 ----- html-parse.js
/** * Not type-checking this file because it's mostly vendor code. */ /*! * HTML Parser By John Resi ...
- vue.js 源代码学习笔记 ----- helpers.js
/* @flow */ import { parseFilters } from './parser/filter-parser' export function baseWarn (msg: str ...
- vue.js 源代码学习笔记 ----- codegen.js
/* @flow */ import { genHandlers } from './events' import { baseWarn, pluckModuleFunction } from '.. ...
- vue.js 源代码学习笔记 ----- fillter-parse.js
/* @flow */ export function parseFilters (exp: string): string { let inSingle = false let inDouble = ...
- vue.js 源代码学习笔记 ----- text-parse.js
/* @flow */ import { cached } from 'shared/util' import { parseFilters } from './filter-parser' //找到 ...
- vue.js 源代码学习笔记 ----- 工具方法 lang
/* @flow */ // Object.freeze 使得这个对象不能增加属性, 修改属性, 这样就保证了这个对象在任何时候都是空的 export const emptyObject = Obje ...
- vue.js 源代码学习笔记 ----- 工具方法 env
/* @flow */ /* globals MutationObserver */ import { noop } from 'shared/util' // can we use __proto_ ...
- vue.js 源代码学习笔记 ----- 工具方法 share
/* @flow */ /** * Convert a value to a string that is actually rendered. { .. } [ .. ] 2 => '' */ ...
- vue.js 源代码学习笔记 ----- instance render
/* @flow */ import { warn, nextTick, toNumber, _toString, looseEqual, emptyObject, handleError, loos ...
随机推荐
- drawable转mitmap 以及图片base64编码
static Bitmap drawableToBitmap(Drawable drawable) // drawable 转换成bitmap { int width = drawable.getIn ...
- 【开发者笔记】C#连接mysql问题记录
1.概述:C#在调用mysql.data.dll连接本地数据库时报错,连接远程Linux服务器上的mysql服务器正常 2.报错记录,当前连接字符串 <add key="dbStrin ...
- Flask系列之自定义中间件
from flask import Flask app = Flask(__name__) @app.route('/index') def index(): return 'Hello World' ...
- Openstack(六)RabbitMQ集群
各组件通过消息发送与接收是实现组件之间的通信: 6.1安装RabbitMQ 6.1.1安装RabbitMQ # yum install rabbitmq-server –y # systemctl s ...
- Educational Codeforces Round 55 (Rated for Div. 2) Solution
A. Vasya and Book Solved. 三种方式取$Min$ #include <bits/stdc++.h> using namespace std; #define ll ...
- CCPC 2016-2017, Finals Solution
A - The Third Cup is Free 水. #include<bits/stdc++.h> using namespace std; ; int n; int arr[max ...
- 打开 EXCEL时出现RUN-TIME ERROR“91”,怎么解决?
方法一: 开始—程序—microsoft—打开“windows office 2007 简易设置”,把“使用 office 03样式经典菜单”前的“√”去掉就OK了 方法二: 1. 打开注册表编辑器. ...
- mysql日期和JDBC查询出来的结果相差8小时
数据库时间:2017-11-08 16:30:00 查询出来: 2017-11-09 00:30:00 问题:数据库时区,和JDBC连接时区设置问题. set global time_zone = ' ...
- 20145325张梓靖 《Java程序设计》第2周学习总结
20145325张梓靖 <Java程序设计>第2周学习总结 教材学习内容总结 整数 short 2字节,int 4字节,long 8字节 字节 byte 1字节 浮点数 float 4字节 ...
- 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 ...