@@ -132,14 +132,20 @@ export function Router(props) {
132
132
if ( matches ) return ( pr = cloneElement ( vnode , m ) ) ;
133
133
if ( vnode . props . default ) d = cloneElement ( vnode , m ) ;
134
134
} ) ;
135
+ const isHydratingSuspense = cur . current && cur . current . __u & MODE_HYDRATE && cur . current . __u & MODE_SUSPENDED ;
135
136
cur . current = h ( RouteContext . Provider , { value : m } , pr || d ) ;
137
+ if ( isHydratingSuspense ) {
138
+ cur . current . __u |= MODE_HYDRATE ;
139
+ cur . current . __u |= MODE_SUSPENDED ;
140
+
141
+ }
136
142
137
143
// Reset previous children - if rendering succeeds synchronously, we shouldn't render the previous children.
138
144
const p = prev . current ;
139
145
prev . current = null ;
140
146
141
147
// This borrows the _childDidSuspend() solution from compat.
142
- this . __c = e => {
148
+ this . __c = ( e , suspendedVNode ) => {
143
149
// Mark the current render as having suspended:
144
150
didSuspend . current = true ;
145
151
@@ -158,6 +164,16 @@ export function Router(props) {
158
164
159
165
// Successful route transition: un-suspend after a tick and stop rendering the old route:
160
166
prev . current = null ;
167
+ if ( cur . current ) {
168
+ if ( suspendedVNode . __u & MODE_SUSPENDED ) {
169
+ cur . current . __u |= MODE_SUSPENDED ;
170
+ }
171
+
172
+ if ( suspendedVNode . __u & MODE_HYDRATE ) {
173
+ cur . current . __u |= MODE_HYDRATE ;
174
+ }
175
+ }
176
+
161
177
RESOLVED . then ( update ) ;
162
178
} ) ;
163
179
} ;
@@ -198,6 +214,9 @@ export function Router(props) {
198
214
return [ h ( RenderRef , { r : cur } ) , h ( RenderRef , { r : prev } ) ] ;
199
215
}
200
216
217
+ const MODE_HYDRATE = 1 << 5 ;
218
+ const MODE_SUSPENDED = 1 << 7 ;
219
+
201
220
// Lazily render a ref's current value:
202
221
const RenderRef = ( { r } ) => r . current ;
203
222
0 commit comments