@@ -5,6 +5,15 @@ import { pascalCase, trim } from '../utils/string'
5
5
import { BIconBlank } from './icons'
6
6
import { commonIconProps } from './helpers/icon-base'
7
7
8
+ const findIconComponent = ( ctx , iconName ) => {
9
+ if ( ! ctx ) {
10
+ return null
11
+ }
12
+ const components = ( ctx . $options || { } ) . components
13
+ const iconComponent = components [ iconName ]
14
+ return iconComponent || findIconComponent ( ctx . $parent , iconName )
15
+ }
16
+
8
17
// Helper BIcon component
9
18
// Requires the requested icon component to be installed
10
19
export const BIcon = /*#__PURE__*/ Vue . extend ( {
@@ -23,13 +32,13 @@ export const BIcon = /*#__PURE__*/ Vue.extend({
23
32
} ,
24
33
render ( h , { data, props, parent } ) {
25
34
const icon = pascalCase ( trim ( props . icon || '' ) ) . replace ( RX_ICON_PREFIX , '' )
26
- const iconName = `BIcon ${ icon } `
35
+
27
36
// If parent context exists, we check to see if the icon has been registered
28
- // Either locally in the parent component, or globally at the `$root` level
37
+ // either locally in the parent component, or globally at the `$root` level
29
38
// If not registered, we render a blank icon
30
- const components = ( ( parent || { } ) . $options || { } ) . components
31
- const componentRefOrName =
32
- icon && components ? components [ iconName ] || BIconBlank : icon ? iconName : BIconBlank
33
- return h ( componentRefOrName , mergeData ( data , { props : { ... props , icon : null } } ) )
39
+ return h (
40
+ icon ? findIconComponent ( parent , `BIcon ${ icon } ` ) || BIconBlank : BIconBlank ,
41
+ mergeData ( data , { props : { ... props , icon : null } } )
42
+ )
34
43
}
35
44
} )
0 commit comments