diff --git a/packages/core/src/componentProxy.ts b/packages/core/src/componentProxy.ts index ba9945a1..c1d95650 100644 --- a/packages/core/src/componentProxy.ts +++ b/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 } diff --git a/packages/core/src/componentState.ts b/packages/core/src/componentState.ts index 7e74bb1a..9a04b02e 100644 --- a/packages/core/src/componentState.ts +++ b/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] } } diff --git a/packages/renderer-dom/src/patchData.ts b/packages/renderer-dom/src/patchData.ts index 64eb1617..f1b42182 100644 --- a/packages/renderer-dom/src/patchData.ts +++ b/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, diff --git a/packages/renderer-dom/src/teardownVNode.ts b/packages/renderer-dom/src/teardownVNode.ts index 322182e0..1aebc94a 100644 --- a/packages/renderer-dom/src/teardownVNode.ts +++ b/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) } } } diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index cec53c72..769343dd 100644 --- a/packages/shared/src/index.ts +++ b/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'