@@ -17,38 +17,14 @@ export default function visitSlot(
17
17
const slotName = getStaticAttributeValue ( node , 'name' ) || 'default' ;
18
18
generator . slots . add ( slotName ) ;
19
19
20
- const name = node . _state . name ;
21
20
const content_name = block . getUniqueName ( `slot_content_${ slotName } ` ) ;
22
-
23
21
block . addVariable ( content_name , `#component._slotted.${ slotName } ` ) ;
24
22
25
- block . addVariable ( name ) ;
26
- block . addElement (
27
- name ,
28
- `@createElement('slot')` ,
29
- `@claimElement(${ state . parentNodes } , 'slot', {${ slotName !== 'default' ? ` name: '${ slotName } ' ` : '' } })` ,
30
- state . parentNode
31
- ) ;
32
-
33
- if ( generator . hydratable ) {
34
- block . builders . claim . addLine (
35
- `var ${ node . _state . parentNodes } = @children(${ name } );`
36
- ) ;
37
- }
38
-
39
- if ( slotName !== 'default' ) {
40
- block . builders . hydrate . addBlock ( deindent `
41
- @setAttribute(${ name } , 'name', '${ slotName } ');
42
- ` ) ;
43
- }
44
-
45
- block . builders . mount . addLine (
46
- `#component.slots.${ slotName } = ${ name } ;`
47
- ) ;
48
-
49
- block . builders . unmount . addLine (
50
- `#component.slots.${ slotName } = null;`
51
- ) ;
23
+ // TODO use surrounds as anchors where possible, a la if/each blocks
24
+ const before = block . getUniqueName ( `${ content_name } _before` ) ;
25
+ const after = block . getUniqueName ( `${ content_name } _after` ) ;
26
+ block . addVariable ( before ) ;
27
+ block . addVariable ( after ) ;
52
28
53
29
block . builders . create . pushCondition ( `!${ content_name } ` ) ;
54
30
block . builders . hydrate . pushCondition ( `!${ content_name } ` ) ;
@@ -57,7 +33,7 @@ export default function visitSlot(
57
33
block . builders . destroy . pushCondition ( `!${ content_name } ` ) ;
58
34
59
35
node . children . forEach ( ( child : Node ) => {
60
- visit ( generator , block , node . _state , child , elementStack . concat ( node ) , componentStack ) ;
36
+ visit ( generator , block , state , child , elementStack , componentStack ) ;
61
37
} ) ;
62
38
63
39
block . builders . create . popCondition ( ) ;
@@ -67,19 +43,34 @@ export default function visitSlot(
67
43
block . builders . destroy . popCondition ( ) ;
68
44
69
45
// TODO can we use an else here?
70
- block . builders . mount . addBlock ( deindent `
71
- if (${ content_name } ) {
72
- @appendNode(${ content_name } , ${ name } );
73
- }
74
- ` ) ;
46
+ if ( state . parentNode ) {
47
+ block . builders . mount . addBlock ( deindent `
48
+ if (${ content_name } ) {
49
+ @appendNode(${ before } || (${ before } = @createComment()), ${ state . parentNode } );
50
+ @appendNode(${ content_name } , ${ state . parentNode } );
51
+ @appendNode(${ after } || (${ after } = @createComment()), ${ state . parentNode } );
52
+ }
53
+ ` ) ;
54
+ } else {
55
+ block . builders . mount . addBlock ( deindent `
56
+ if (${ content_name } ) {
57
+ @insertNode(${ before } || (${ before } = @createComment()), #target, anchor);
58
+ @insertNode(${ content_name } , #target, anchor);
59
+ @insertNode(${ after } || (${ after } = @createComment()), #target, anchor);
60
+ }
61
+ ` ) ;
62
+ }
75
63
76
64
// if the slot is unmounted, move nodes back into the document fragment,
77
65
// so that it can be reinserted later
78
66
// TODO so that this can work with public API, component._slotted should
79
67
// be all fragments, derived from options.slots. Not === options.slots
68
+ // TODO can we use an else here?
80
69
block . builders . unmount . addBlock ( deindent `
81
70
if (${ content_name } ) {
82
- while (${ name } .firstChild) @appendNode(${ name } .firstChild, ${ content_name } );
71
+ @reinsertBetween(${ before } , ${ after } , ${ content_name } );
72
+ @detachNode(${ before } );
73
+ @detachNode(${ after } );
83
74
}
84
75
` ) ;
85
76
}
0 commit comments