feat: runtime component name validation (#217)

This commit is contained in:
月迷津渡
2019-10-15 03:36:30 +08:00
committed by Evan You
parent fd209f5a66
commit 66023a8886
4 changed files with 131 additions and 5 deletions

View File

@@ -12,7 +12,7 @@ import {
callWithErrorHandling,
callWithAsyncErrorHandling
} from './errorHandling'
import { AppContext, createAppContext } from './apiApp'
import { AppContext, createAppContext, AppConfig } from './apiApp'
import { Directive } from './directives'
import { applyOptions, ComponentOptions } from './apiOptions'
import {
@@ -21,7 +21,8 @@ import {
capitalize,
NOOP,
isArray,
isObject
isObject,
NO
} from '@vue/shared'
import { SuspenseBoundary } from './suspense'
import {
@@ -223,11 +224,37 @@ export const setCurrentInstance = (
currentInstance = instance
}
const BuiltInTagSet = new Set(['slot', 'component'])
const isBuiltInTag = (tag: string) => BuiltInTagSet.has(tag)
export function validateComponentName(name: string, config: AppConfig) {
const appIsNativeTag = config.isNativeTag || NO
if (isBuiltInTag(name) || appIsNativeTag(name)) {
warn(
'Do not use built-in or reserved HTML elements as component id: ' + name
)
}
}
export function setupStatefulComponent(
instance: ComponentInternalInstance,
parentSuspense: SuspenseBoundary | null
) {
const Component = instance.type as ComponentOptions
if (__DEV__) {
if (Component.name) {
validateComponentName(Component.name, instance.appContext.config)
}
if (Component.components) {
const names = Object.keys(Component.components)
for (let i = 0; i < names.length; i++) {
const name = names[i]
validateComponentName(name, instance.appContext.config)
}
}
}
// 1. create render proxy
instance.renderProxy = new Proxy(instance, PublicInstanceProxyHandlers)
// 2. create props proxy