feat(core): support recursively resolving self component by name
This commit is contained in:
		
							parent
							
								
									c8895e7cb9
								
							
						
					
					
						commit
						f5f2dca132
					
				| @ -2,7 +2,8 @@ import { currentRenderingInstance } from '../componentRenderUtils' | ||||
| import { | ||||
|   currentInstance, | ||||
|   Component, | ||||
|   ComponentInternalInstance | ||||
|   ComponentInternalInstance, | ||||
|   FunctionalComponent | ||||
| } from '../component' | ||||
| import { Directive } from '../directives' | ||||
| import { | ||||
| @ -14,8 +15,11 @@ import { | ||||
| } from '@vue/shared' | ||||
| import { warn } from '../warning' | ||||
| 
 | ||||
| const COMPONENTS = 'components' | ||||
| const DIRECTIVES = 'directives' | ||||
| 
 | ||||
| export function resolveComponent(name: string): Component | undefined { | ||||
|   return resolveAsset('components', name) | ||||
|   return resolveAsset(COMPONENTS, name) | ||||
| } | ||||
| 
 | ||||
| export function resolveDynamicComponent( | ||||
| @ -28,42 +32,54 @@ export function resolveDynamicComponent( | ||||
| ): Component | undefined { | ||||
|   if (!component) return | ||||
|   if (isString(component)) { | ||||
|     return resolveAsset('components', component, instance) | ||||
|     return resolveAsset(COMPONENTS, component, instance) | ||||
|   } else if (isFunction(component) || isObject(component)) { | ||||
|     return component | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| export function resolveDirective(name: string): Directive | undefined { | ||||
|   return resolveAsset('directives', name) | ||||
|   return resolveAsset(DIRECTIVES, name) | ||||
| } | ||||
| 
 | ||||
| // overload 1: components
 | ||||
| function resolveAsset( | ||||
|   type: 'components', | ||||
|   type: typeof COMPONENTS, | ||||
|   name: string, | ||||
|   instance?: ComponentInternalInstance | ||||
| ): Component | undefined | ||||
| // overload 2: directives
 | ||||
| function resolveAsset( | ||||
|   type: 'directives', | ||||
|   type: typeof DIRECTIVES, | ||||
|   name: string, | ||||
|   instance?: ComponentInternalInstance | ||||
| ): Directive | undefined | ||||
| 
 | ||||
| function resolveAsset( | ||||
|   type: 'components' | 'directives', | ||||
|   type: typeof COMPONENTS | typeof DIRECTIVES, | ||||
|   name: string, | ||||
|   instance: ComponentInternalInstance | null = currentRenderingInstance || | ||||
|     currentInstance | ||||
| ) { | ||||
|   if (instance) { | ||||
|     let camelized | ||||
|     let camelized, capitalized | ||||
|     const registry = instance[type] | ||||
|     const res = | ||||
|     let res = | ||||
|       registry[name] || | ||||
|       registry[(camelized = camelize(name))] || | ||||
|       registry[capitalize(camelized)] | ||||
|       registry[(capitalized = capitalize(camelized))] | ||||
|     if (!res && type === COMPONENTS) { | ||||
|       const self = instance.type | ||||
|       const selfName = (self as FunctionalComponent).displayName || self.name | ||||
|       if ( | ||||
|         selfName && | ||||
|         (selfName === name || | ||||
|           selfName === camelized || | ||||
|           selfName === capitalized) | ||||
|       ) { | ||||
|         res = self | ||||
|       } | ||||
|     } | ||||
|     if (__DEV__ && !res) { | ||||
|       warn(`Failed to resolve ${type.slice(0, -1)}: ${name}`) | ||||
|     } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user