本节目标实现ReactDOM.render,只关心向 DOM 添加内容,之后处理更新和删除内容;
本节代码实现目录为:react/react-dom.js文件;
有了虚拟 DOM 数据结构,接下来要把它转换成真实的DOM结构渲染到页面上,基本分为四步:
具体实现步骤:
// react/react-dom.js
/**
* 将虚拟 DOM 转换为真实 DOM 并添加到容器中
* @param {element} 虚拟 DOM
* @param {container} 真实 DOM
*/
function render(element, container) {
const dom = document.createElement(element.type)
container.appendChild(dom)
}
复制代码
element.props.children.forEach(child =>
render(child, dom)
)
复制代码
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]
})
复制代码
以上我们实现了一个jsx转换为dom的库,测试一下:
在src/index.js文件添加React.render方法:
// src/index
import React from '../react';
const element = (
<div id="foo">
<a>bar</a>
<b />
</div>
)
React.render(element, document.getElementById('root'))
复制代码
在src目录下添加index.html文件,并添加一个dom属性为id的节点:
修改webpack配置,添加html模板:
运行命令 npm run start 启动,可以看到已经成功显示出结果:
使用流程图简单总结一下2、3小节:
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。