|
|
@@ -24,7 +24,7 @@ import { Slots, initSlots, InternalSlots } from './componentSlots'
|
|
|
import { warn } from './warning'
|
|
|
import { ErrorCodes, callWithErrorHandling } from './errorHandling'
|
|
|
import { AppContext, createAppContext, AppConfig } from './apiCreateApp'
|
|
|
-import { Directive, validateDirectiveName } from './directives'
|
|
|
+import { validateDirectiveName } from './directives'
|
|
|
import { applyOptions, ComponentOptions } from './componentOptions'
|
|
|
import {
|
|
|
EmitsOptions,
|
|
|
@@ -223,17 +223,6 @@ export interface ComponentInternalInstance {
|
|
|
*/
|
|
|
renderCache: (Function | VNode)[]
|
|
|
|
|
|
- /**
|
|
|
- * Asset hashes that prototypally inherits app-level asset hashes for fast
|
|
|
- * resolution
|
|
|
- * @internal
|
|
|
- */
|
|
|
- components: Record<string, Component>
|
|
|
- /**
|
|
|
- * @internal
|
|
|
- */
|
|
|
- directives: Record<string, Directive>
|
|
|
-
|
|
|
// the rest are only for stateful components ---------------------------------
|
|
|
|
|
|
// main proxy that serves as the public instance (`this`)
|
|
|
@@ -354,15 +343,17 @@ export function createComponentInstance(
|
|
|
parent: ComponentInternalInstance | null,
|
|
|
suspense: SuspenseBoundary | null
|
|
|
) {
|
|
|
+ const type = vnode.type as Component
|
|
|
// inherit parent app context - or - if root, adopt from root vnode
|
|
|
const appContext =
|
|
|
(parent ? parent.appContext : vnode.appContext) || emptyAppContext
|
|
|
+
|
|
|
const instance: ComponentInternalInstance = {
|
|
|
uid: uid++,
|
|
|
vnode,
|
|
|
+ type,
|
|
|
parent,
|
|
|
appContext,
|
|
|
- type: vnode.type as Component,
|
|
|
root: null!, // to be immediately set
|
|
|
next: null,
|
|
|
subTree: null!, // will be set synchronously right after creation
|
|
|
@@ -385,10 +376,6 @@ export function createComponentInstance(
|
|
|
setupState: EMPTY_OBJ,
|
|
|
setupContext: null,
|
|
|
|
|
|
- // per-instance asset storage (mutable during options resolution)
|
|
|
- components: Object.create(appContext.components),
|
|
|
- directives: Object.create(appContext.directives),
|
|
|
-
|
|
|
// suspense related
|
|
|
suspense,
|
|
|
asyncDep: null,
|
|
|
@@ -727,14 +714,18 @@ export function formatComponentName(
|
|
|
}
|
|
|
|
|
|
if (!name && instance && instance.parent) {
|
|
|
- // try to infer the name based on local resolution
|
|
|
- const registry = instance.parent.components
|
|
|
- for (const key in registry) {
|
|
|
- if (registry[key] === Component) {
|
|
|
- name = key
|
|
|
- break
|
|
|
+ // try to infer the name based on reverse resolution
|
|
|
+ const inferFromRegistry = (registry: Record<string, any> | undefined) => {
|
|
|
+ for (const key in registry) {
|
|
|
+ if (registry[key] === Component) {
|
|
|
+ return key
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ name =
|
|
|
+ inferFromRegistry(
|
|
|
+ (instance.parent.type as ComponentOptions).components
|
|
|
+ ) || inferFromRegistry(instance.appContext.components)
|
|
|
}
|
|
|
|
|
|
return name ? classify(name) : isRoot ? `App` : `Anonymous`
|