我们现在来实现一下。ReactDOM.render方法。
我们只做把将元素添加到DOM节点上。
1 | function render(element, container) { |
我们还需要递归的遍历,将子元素也添加上。1
2
3
4
5
6
7
8
9function render(element, container) {
const dom = document.createElement(element.type)
element.props.children.forEach(child => {
return render(child, dom);
})
container.appendChild(dom);
}
还需要处理纯文本元素,如果element的type是TEXT_ELEMENT我们将创建一个text node。1
2
3
4
5
6
7
8
9
10
11function render(element, container) {
const dom = element.type === "TEXT_ELEMENT" ?
document.createTextNode("")
: document.createElement(element.type)
element.props.children.forEach(child => {
return render(child, dom);
})
container.appendChild(dom);
}
最后我们将元素的props添加到元素上。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16function render(element, container) {
const dom = element.type === "TEXT_ELEMENT" ?
document.createTextNode("")
: document.createElement(element.type)
const isProperty = key => key !== "children";
Object.keys(element.props).filter(isProperty).forEach(name => {
dom[name] = element.props[name]
})
element.props.children.forEach(child => {
return render(child, dom);
})
container.appendChild(dom);
}
至此我们就完成了全部,JSX渲染到DOM上的整个过程。