@@ -17,7 +17,14 @@ import { setProperty } from './props';
17
17
import { renderClassComponent , renderFunctionComponent } from './component' ;
18
18
import { createInternal } from '../tree' ;
19
19
import options from '../options' ;
20
- import { rendererState } from '../component' ;
20
+ import {
21
+ commitQueue ,
22
+ getCurrentContext ,
23
+ getCurrentParentDom ,
24
+ setCurrentContext ,
25
+ setCurrentParentDom
26
+ } from './renderer' ;
27
+
21
28
/**
22
29
* Diff two virtual nodes and apply proper changes to the DOM
23
30
* @param {import('../internal').Internal } internal The Internal node to mount
@@ -37,37 +44,34 @@ export function mount(internal, newVNode, startDom) {
37
44
// the page. Root nodes can occur anywhere in the tree and not just at the
38
45
// top.
39
46
let prevStartDom = startDom ;
40
- let prevParentDom = rendererState . _parentDom ;
47
+ let prevParentDom = getCurrentParentDom ( ) ;
41
48
if ( internal . flags & TYPE_ROOT ) {
42
- rendererState . _parentDom = newVNode . props . _parentDom ;
49
+ let newParentDom = newVNode . props . _parentDom ;
50
+ setCurrentParentDom ( newParentDom ) ;
43
51
44
52
// Note: this is likely always true because we are inside mount()
45
- if ( rendererState . _parentDom !== prevParentDom ) {
53
+ if ( newParentDom !== prevParentDom ) {
46
54
startDom = null ;
47
55
}
48
56
}
49
57
50
- let prevContext = rendererState . _context ;
58
+ let prevContext = getCurrentContext ( ) ;
51
59
// Necessary for createContext api. Setting this property will pass
52
60
// the context value as `this.context` just for this component.
53
61
let tmp = newVNode . type . contextType ;
54
- let provider = tmp && rendererState . _context [ tmp . _id ] ;
62
+ let provider = tmp && prevContext [ tmp . _id ] ;
55
63
let componentContext = tmp
56
64
? provider
57
65
? provider . props . value
58
66
: tmp . _defaultValue
59
- : rendererState . _context ;
67
+ : prevContext ;
60
68
61
69
if ( provider ) provider . _subs . add ( internal ) ;
62
70
63
71
let renderResult ;
64
72
65
73
if ( internal . flags & TYPE_CLASS ) {
66
- renderResult = renderClassComponent (
67
- internal ,
68
- null ,
69
- componentContext
70
- ) ;
74
+ renderResult = renderClassComponent ( internal , null , componentContext ) ;
71
75
} else {
72
76
renderResult = renderFunctionComponent (
73
77
internal ,
@@ -91,23 +95,19 @@ export function mount(internal, newVNode, startDom) {
91
95
renderResult = [ renderResult ] ;
92
96
}
93
97
94
- nextDomSibling = mountChildren (
95
- internal ,
96
- renderResult ,
97
- startDom
98
- ) ;
98
+ nextDomSibling = mountChildren ( internal , renderResult , startDom ) ;
99
99
}
100
100
101
101
if (
102
102
internal . _commitCallbacks != null &&
103
103
internal . _commitCallbacks . length
104
104
) {
105
- rendererState . _commitQueue . push ( internal ) ;
105
+ commitQueue . push ( internal ) ;
106
106
}
107
107
108
108
if (
109
109
internal . flags & TYPE_ROOT &&
110
- prevParentDom !== rendererState . _parentDom
110
+ prevParentDom !== getCurrentParentDom ( )
111
111
) {
112
112
// If we just mounted a root node/Portal, and it changed the parentDom
113
113
// of it's children, then we need to resume the diff from it's previous
@@ -117,10 +117,10 @@ export function mount(internal, newVNode, startDom) {
117
117
nextDomSibling = prevStartDom ;
118
118
}
119
119
120
- rendererState . _parentDom = prevParentDom ;
120
+ setCurrentParentDom ( prevParentDom ) ;
121
121
// In the event this subtree creates a new context for its children, restore
122
122
// the previous context for its siblings
123
- rendererState . _context = prevContext ;
123
+ setCurrentContext ( prevContext ) ;
124
124
} else {
125
125
// @TODO : we could just assign this as internal.dom here
126
126
let hydrateDom =
@@ -269,14 +269,14 @@ function mountElement(internal, dom) {
269
269
dom . innerHTML = newHtml . __html ;
270
270
}
271
271
} else if ( newChildren != null ) {
272
- const prevParentDom = rendererState . _parentDom ;
273
- rendererState . _parentDom = dom ;
272
+ const prevParentDom = getCurrentParentDom ( ) ;
273
+ setCurrentParentDom ( dom ) ;
274
274
mountChildren (
275
275
internal ,
276
276
Array . isArray ( newChildren ) ? newChildren : [ newChildren ] ,
277
277
isNew ? null : dom . firstChild
278
278
) ;
279
- rendererState . _parentDom = prevParentDom ;
279
+ setCurrentParentDom ( prevParentDom ) ;
280
280
}
281
281
282
282
// (as above, don't diff props during hydration)
@@ -295,11 +295,7 @@ function mountElement(internal, dom) {
295
295
* @param {import('../internal').ComponentChild[] } children
296
296
* @param {import('../internal').PreactNode } startDom
297
297
*/
298
- export function mountChildren (
299
- internal ,
300
- children ,
301
- startDom
302
- ) {
298
+ export function mountChildren ( internal , children , startDom ) {
303
299
let internalChildren = ( internal . _children = [ ] ) ,
304
300
i ,
305
301
childVNode ,
@@ -321,11 +317,7 @@ export function mountChildren(
321
317
internalChildren [ i ] = childInternal ;
322
318
323
319
// Morph the old element into the new one, but don't append it to the dom yet
324
- mountedNextChild = mount (
325
- childInternal ,
326
- childVNode ,
327
- startDom
328
- ) ;
320
+ mountedNextChild = mount ( childInternal , childVNode , startDom ) ;
329
321
330
322
newDom = childInternal . _dom ;
331
323
@@ -338,7 +330,7 @@ export function mountChildren(
338
330
// The DOM the diff should begin with is now startDom (since we inserted
339
331
// newDom before startDom) so ignore mountedNextChild and continue with
340
332
// startDom
341
- rendererState . _parentDom . insertBefore ( newDom , startDom ) ;
333
+ getCurrentParentDom ( ) . insertBefore ( newDom , startDom ) ;
342
334
}
343
335
344
336
if ( childInternal . ref ) {
0 commit comments