Просмотр исходного кода

refactor: use faster key check

Evan You 7 лет назад
Родитель
Сommit
1c42c96d1a

+ 3 - 3
packages/core/src/componentProxy.ts

@@ -1,5 +1,5 @@
 import { ComponentInstance } from './component'
-import { isString, isFunction } from '@vue/shared'
+import { isFunction, isReservedKey } from '@vue/shared'
 
 const bindCache = new WeakMap()
 
@@ -37,7 +37,7 @@ const renderProxyHandlers = {
     ) {
       // computed
       return target._computedGetters[key]()
-    } else {
+    } else if (key[0] !== '_') {
       if (__DEV__ && !(key in target)) {
         // TODO warn non-present property
       }
@@ -57,7 +57,7 @@ const renderProxyHandlers = {
     receiver: any
   ): boolean {
     if (__DEV__) {
-      if (isString(key) && key[0] === '$') {
+      if (isReservedKey(key)) {
         // TODO warn setting immutable properties
         return false
       }

+ 2 - 3
packages/core/src/componentState.ts

@@ -1,7 +1,6 @@
 import { ComponentInstance } from './component'
 import { observable } from '@vue/observer'
-
-const internalRE = /^_|^\$/
+import { isReservedKey } from '@vue/shared'
 
 export function initializeState(instance: ComponentInstance) {
   const { data } = instance.$options
@@ -18,7 +17,7 @@ export function extractInitializers(
   const keys = Object.keys(instance)
   for (let i = 0; i < keys.length; i++) {
     const key = keys[i]
-    if (!internalRE.test(key)) {
+    if (!isReservedKey(key)) {
       data[key] = (instance as any)[key]
     }
   }

+ 3 - 8
packages/renderer-dom/src/patchData.ts

@@ -4,7 +4,7 @@ import { patchStyle } from './modules/style'
 import { patchAttr } from './modules/attrs'
 import { patchDOMProp } from './modules/props'
 import { patchEvent } from './modules/events'
-import { onRE } from '@vue/shared'
+import { isOn } from '@vue/shared'
 
 // value, checked, selected & muted
 // plus anything with upperCase letter in it are always patched as properties
@@ -29,13 +29,8 @@ export function patchData(
       patchStyle(el, prevValue, nextValue, nextVNode.data)
       break
     default:
-      if (onRE.test(key)) {
-        patchEvent(
-          el,
-          key.replace(onRE, '').toLowerCase(),
-          prevValue,
-          nextValue
-        )
+      if (isOn(key)) {
+        patchEvent(el, key.slice(2).toLowerCase(), prevValue, nextValue)
       } else if (domPropsRE.test(key)) {
         patchDOMProp(
           el,

+ 3 - 3
packages/renderer-dom/src/teardownVNode.ts

@@ -1,13 +1,13 @@
 import { VNode } from '@vue/core'
 import { handleDelegatedEvent } from './modules/events'
-import { onRE } from '@vue/shared'
+import { isOn } from '@vue/shared'
 
 export function teardownVNode(vnode: VNode) {
   const { el, data } = vnode
   if (data != null) {
     for (const key in data) {
-      if (onRE.test(key)) {
-        handleDelegatedEvent(el, key.toLowerCase().slice(2), null)
+      if (isOn(key)) {
+        handleDelegatedEvent(el, key.slice(2).toLowerCase(), null)
       }
     }
   }

+ 3 - 1
packages/shared/src/index.ts

@@ -2,9 +2,11 @@ export const EMPTY_OBJ: { readonly [key: string]: any } = Object.freeze({})
 
 export const NOOP = () => {}
 
-export const onRE = /^on/
 export const reservedPropRE = /^(?:key|ref|slots)$|^vnode/
 
+export const isOn = (key: string) => key[0] === 'o' && key[1] === 'n'
+export const isReservedKey = (key: string) => key[0] === '_' || key[0] === '$'
+
 export const isArray = Array.isArray
 export const isFunction = (val: any): val is Function =>
   typeof val === 'function'