@@ -35,12 +35,17 @@ import type { RawSlots, VaporSlot } from './componentSlots'
35
35
import { renderEffect } from './renderEffect'
36
36
import { createTextNode } from './dom/node'
37
37
import { optimizePropertyLookup } from './dom/prop'
38
- import { hydrateNode as vaporHydrateNode } from './dom/hydration'
38
+ import {
39
+ currentHydrationNode ,
40
+ isHydrating ,
41
+ locateHydrationNode ,
42
+ hydrateNode as vaporHydrateNode ,
43
+ } from './dom/hydration'
39
44
40
45
// mounting vapor components and slots in vdom
41
46
const vaporInteropImpl : Omit <
42
47
VaporInteropInterface ,
43
- 'vdomMount' | 'vdomUnmount' | 'vdomSlot' | 'vdomHydrate'
48
+ 'vdomMount' | 'vdomUnmount' | 'vdomSlot'
44
49
> = {
45
50
mount ( vnode , container , anchor , parentComponent ) {
46
51
const selfAnchor = ( vnode . el = vnode . anchor = createTextNode ( ) )
@@ -144,6 +149,8 @@ const vaporSlotsProxyHandler: ProxyHandler<any> = {
144
149
} ,
145
150
}
146
151
152
+ let vdomHydrateNode : HydrationRenderer [ 'hydrateNode' ] | undefined
153
+
147
154
/**
148
155
* Mount vdom component in vapor
149
156
*/
@@ -152,7 +159,7 @@ function createVDOMComponent(
152
159
component : ConcreteComponent ,
153
160
rawProps ?: LooseRawProps | null ,
154
161
rawSlots ?: LooseRawSlots | null ,
155
- ) : [ VaporFragment , VNode ] {
162
+ ) : VaporFragment {
156
163
const frag = new VaporFragment ( [ ] )
157
164
const vnode = createVNode (
158
165
component ,
@@ -181,16 +188,30 @@ function createVDOMComponent(
181
188
}
182
189
183
190
frag . insert = ( parentNode , anchor ) => {
184
- if ( ! isMounted ) {
185
- internals . mt (
186
- vnode ,
187
- parentNode ,
188
- anchor ,
189
- parentInstance as any ,
190
- null ,
191
- undefined ,
192
- false ,
193
- )
191
+ if ( ! isMounted || isHydrating ) {
192
+ if ( isHydrating ) {
193
+ ; (
194
+ vdomHydrateNode ||
195
+ ( vdomHydrateNode = ensureHydrationRenderer ( ) . hydrateNode ! )
196
+ ) (
197
+ currentHydrationNode ! ,
198
+ vnode ,
199
+ parentInstance as any ,
200
+ null ,
201
+ null ,
202
+ false ,
203
+ )
204
+ } else {
205
+ internals . mt (
206
+ vnode ,
207
+ parentNode ,
208
+ anchor ,
209
+ parentInstance as any ,
210
+ null ,
211
+ undefined ,
212
+ false ,
213
+ )
214
+ }
194
215
onScopeDispose ( unmount , true )
195
216
isMounted = true
196
217
} else {
@@ -207,7 +228,7 @@ function createVDOMComponent(
207
228
208
229
frag . remove = unmount
209
230
210
- return [ frag , vnode ]
231
+ return frag
211
232
}
212
233
213
234
/**
@@ -235,28 +256,43 @@ function renderVDOMSlot(
235
256
isFunction ( name ) ? name ( ) : name ,
236
257
props ,
237
258
)
238
- if ( ( vnode . children as any [ ] ) . length ) {
239
- if ( fallbackNodes ) {
240
- remove ( fallbackNodes , parentNode )
241
- fallbackNodes = undefined
242
- }
243
- internals . p (
244
- oldVNode ,
259
+ if ( isHydrating ) {
260
+ locateHydrationNode ( true )
261
+ ; (
262
+ vdomHydrateNode ||
263
+ ( vdomHydrateNode = ensureHydrationRenderer ( ) . hydrateNode ! )
264
+ ) (
265
+ currentHydrationNode ! ,
245
266
vnode ,
246
- parentNode ,
247
- anchor ,
248
267
parentComponent as any ,
268
+ null ,
269
+ null ,
270
+ false ,
249
271
)
250
- oldVNode = vnode
251
272
} else {
252
- if ( fallback && ! fallbackNodes ) {
253
- // mount fallback
254
- if ( oldVNode ) {
255
- internals . um ( oldVNode , parentComponent as any , null , true )
273
+ if ( ( vnode . children as any [ ] ) . length ) {
274
+ if ( fallbackNodes ) {
275
+ remove ( fallbackNodes , parentNode )
276
+ fallbackNodes = undefined
277
+ }
278
+ internals . p (
279
+ oldVNode ,
280
+ vnode ,
281
+ parentNode ,
282
+ anchor ,
283
+ parentComponent as any ,
284
+ )
285
+ oldVNode = vnode
286
+ } else {
287
+ if ( fallback && ! fallbackNodes ) {
288
+ // mount fallback
289
+ if ( oldVNode ) {
290
+ internals . um ( oldVNode , parentComponent as any , null , true )
291
+ }
292
+ insert ( ( fallbackNodes = fallback ( props ) ) , parentNode , anchor )
256
293
}
257
- insert ( ( fallbackNodes = fallback ( props ) ) , parentNode , anchor )
294
+ oldVNode = null
258
295
}
259
- oldVNode = null
260
296
}
261
297
} )
262
298
isMounted = true
@@ -284,14 +320,11 @@ function renderVDOMSlot(
284
320
}
285
321
286
322
export const vaporInteropPlugin : Plugin = app => {
287
- const { internals, hydrateNode } = (
288
- app . _ssr ? ensureHydrationRenderer ( ) : ensureRenderer ( )
289
- ) as HydrationRenderer
323
+ const internals = ensureRenderer ( ) . internals
290
324
app . _context . vapor = extend ( vaporInteropImpl , {
291
325
vdomMount : createVDOMComponent . bind ( null , internals ) ,
292
326
vdomUnmount : internals . umt ,
293
327
vdomSlot : renderVDOMSlot . bind ( null , internals ) ,
294
- vdomHydrate : hydrateNode ,
295
328
} )
296
329
const mount = app . mount
297
330
app . mount = ( ( ...args ) => {
0 commit comments