@@ -14,8 +14,6 @@ const unfreeze = (object, property, value = null) => {
14
14
} ) ;
15
15
} ;
16
16
17
-
18
-
19
17
export default {
20
18
abstract : true ,
21
19
name : 'Fragment' ,
@@ -28,8 +26,8 @@ export default {
28
26
} ,
29
27
30
28
mounted ( ) {
31
- const container = this . $el ;
32
- const parent = container . parentNode ;
29
+ const container = this . $el
30
+ const parent = container . parentNode
33
31
34
32
container . __isFragment = true
35
33
container . __isMounted = false
@@ -39,90 +37,33 @@ export default {
39
37
40
38
container . __head = head
41
39
container . __tail = tail
42
-
43
- parent . insertBefore ( head , container )
44
- parent . insertBefore ( tail , container )
45
-
46
- container . appendChild = ( node ) => {
47
- parent . insertBefore ( node , tail )
48
- freeze ( node , 'parentNode' , container )
49
- }
50
-
51
- container . insertBefore = ( node , ref ) => {
52
- parent . insertBefore ( node , ref )
53
- freeze ( node , 'parentNode' , container )
54
- }
55
-
56
- container . removeChild = ( node ) => {
57
- parent . removeChild ( node )
58
- unfreeze ( node , 'parentNode' )
59
- }
40
+
41
+ // use document fragment to improve efficiency
42
+ let tpl = document . createDocumentFragment ( )
43
+ tpl . appendChild ( head )
60
44
61
45
Array . from ( container . childNodes )
62
- . forEach ( node => container . appendChild ( node ) )
63
-
46
+ . forEach ( node => {
47
+ // container.appendChild(node, true)
48
+ let notFrChild = ! node . hasOwnProperty ( '__isFragmentChild__' )
49
+ tpl . appendChild ( node )
50
+ if ( notFrChild ) {
51
+ freeze ( node , 'parentNode' , container )
52
+ freeze ( node , '__isFragmentChild__' , true )
53
+ }
54
+ } )
55
+
56
+ tpl . appendChild ( tail )
57
+
58
+ let next = container . nextSibling
59
+ parent . insertBefore ( tpl , container , true )
64
60
parent . removeChild ( container )
65
-
66
61
freeze ( container , 'parentNode' , parent )
67
- freeze ( container , 'nextSibling' , tail . nextSibling )
68
- if ( tail . nextSibling )
69
- freeze ( tail . nextSibling , 'previousSibling' , container )
62
+ freeze ( container , 'nextSibling' , next )
63
+ if ( next )
64
+ freeze ( next , 'previousSibling' , container )
70
65
71
66
container . __isMounted = true
72
-
73
- if ( ! parent . __isFragmentParent ) {
74
- parent . __isFragmentParent = true
75
- const insertBefore = parent . insertBefore ;
76
- parent . insertBefore = ( node , ref ) => {
77
- let realRef = ! ! ref && ! ! ref . __isFragment && ! ! ref . __isMounted ? ref . __head : ref
78
- if ( ! ! node . __isFragment && ! ! node . __isMounted ) {
79
- if ( node === ref ) {
80
- console . error ( "something must be wrong" )
81
- return
82
- }
83
- freeze ( node , 'parentNode' , parent )
84
- if ( node . previousSibling )
85
- freeze ( node . previousSibling , 'nextSibling' , node . nextSibling )
86
- if ( node . nextSibling )
87
- freeze ( node . nextSibling , 'previousSibling' , node . previousSibling )
88
- freeze ( node , 'nextSibling' , ref )
89
- freeze ( node , 'previousSibling' , ref . previousSibling )
90
- if ( ref . previousSibling )
91
- freeze ( ref . previousSibling , 'nextSibling' , node )
92
- freeze ( ref , 'previousSibling' , node )
93
-
94
- let children = [ ]
95
- let ele = node . __head
96
- while ( ele !== node . __tail ) {
97
- children . push ( ele )
98
- ele = ele . nextSibling
99
- }
100
- children . push ( node . __tail )
101
- for ( let child of children ) {
102
- insertBefore . call ( parent , child , realRef )
103
- }
104
- } else
105
- insertBefore . call ( parent , node , realRef )
106
- }
107
-
108
-
109
- const removeChild = parent . removeChild ;
110
- parent . removeChild = ( node ) => {
111
- if ( ! ! node . __isFragment && ! ! node . __isMounted ) {
112
- while ( node . __head . nextSibling !== node . __tail )
113
- node . removeChild ( node . __head . nextSibling ) // container.removeChild(head.nextSibling)
114
-
115
- parent . removeChild ( node . __head )
116
- parent . removeChild ( node . __tail )
117
- unfreeze ( container , 'parentNode' )
118
-
119
- // parent.insertBefore = insertBefore
120
- // parent.removeChild = removeChild
121
- } else {
122
- removeChild . call ( parent , node )
123
- }
124
- }
125
- }
126
67
} ,
127
68
128
69
render ( h ) {
0 commit comments