Skip to content

Commit 3ee425a

Browse files
kerlwJ-Rojas
authored andcommitted
improvement
1. use hooked Node's prototype functions to do the fragment logical 2. use document fragment to improve efficiency
1 parent ef24ce0 commit 3ee425a

File tree

1 file changed

+23
-82
lines changed

1 file changed

+23
-82
lines changed

src/component.js

Lines changed: 23 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ const unfreeze = (object, property, value = null) => {
1414
});
1515
};
1616

17-
18-
1917
export default {
2018
abstract: true,
2119
name: 'Fragment',
@@ -28,8 +26,8 @@ export default {
2826
},
2927

3028
mounted() {
31-
const container = this.$el;
32-
const parent = container.parentNode;
29+
const container = this.$el
30+
const parent = container.parentNode
3331

3432
container.__isFragment = true
3533
container.__isMounted = false
@@ -39,90 +37,33 @@ export default {
3937

4038
container.__head = head
4139
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)
6044

6145
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)
6460
parent.removeChild(container)
65-
6661
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)
7065

7166
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-
}
12667
},
12768

12869
render(h) {

0 commit comments

Comments
 (0)