-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcommit.ts
55 lines (47 loc) · 1.26 KB
/
commit.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import { Ref } from './type'
import { updateElement } from './dom'
import { isFn, TAG } from './reconcile'
export const commit = (fiber: any) => {
if (!fiber) {
return
}
const { op, before, elm } = fiber.action || {}
if (op & TAG.INSERT || op & TAG.MOVE) {
if (fiber.isComp && fiber.child) {
fiber.child.action.op |= fiber.action.op
} else {
fiber.parentNode.insertBefore(elm.node, before?.node)
}
}
if (op & TAG.UPDATE) {
if (fiber.isComp && fiber.child) {
fiber.child.action.op |= fiber.action.op
} else {
updateElement(fiber.node, fiber.old.props || {}, fiber.props)
}
}
refer(fiber.ref, fiber.node)
fiber.action = null
commit(fiber.child)
commit(fiber.sibling)
}
const refer = (ref?: Ref<HTMLElement | undefined>, dom?: HTMLElement) => {
if (ref)
isFn(ref) ? ref(dom) : ref.current = dom
}
const kidsRefer = (kids: any) => {
kids.forEach(kid => {
kid.kids && kidsRefer(kid.kids)
refer(kid.ref, null)
})
}
export const removeElement = fiber => {
if (fiber.isComp) {
fiber.hooks && fiber.hooks.list.forEach(e => e[2] && e[2]())
fiber.kids.forEach(removeElement)
} else {
fiber.parentNode.removeChild(fiber.node)
kidsRefer(fiber.kids)
refer(fiber.ref, null)
}
}