前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >跟着写一遍就会了,手写一个mini版本的React(2.render)

跟着写一遍就会了,手写一个mini版本的React(2.render)

作者头像
玖柒的小窝
修改2021-10-20 10:15:51
3590
修改2021-10-20 10:15:51
举报
文章被收录于专栏:各类技术文章~各类技术文章~

本节目标实现ReactDOM.render,只关心向 DOM 添加内容,之后处理更新和删除内容; ​

本节代码实现目录为:react/react-dom.js文件;

有了虚拟 DOM 数据结构,接下来要把它转换成真实的DOM结构渲染到页面上,基本分为四步: ​

  • 创建不同类型节点
  • 添加属性 props
  • 遍历 children,递归调用 render
  • 将生成的节点 append 到 root 根节点上

具体实现步骤: ​

1、新建react-dom.js文件

image.png
image.png

2、创建 DOM 节点,然后将新节点添加到容器

代码语言:javascript
复制
// 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)
}
复制代码

3、将 element.props.children 都添加至 dom 节点中

代码语言:javascript
复制
 element.props.children.forEach(child =>
    render(child, dom)
  )
复制代码

4、处理文本节点

代码语言:javascript
复制
const dom =
    element.type == "TEXT_ELEMENT"
      ? document.createTextNode("")
      : document.createElement(element.type)
复制代码

5、为节点绑定属性

代码语言:javascript
复制
// 为节点绑定属性
  const isProperty = key => key !== "children"
  Object.keys(element.props)
    .filter(isProperty)
    .forEach(name => {
      dom[name] = element.props[name]
    })
复制代码

6、测试

以上我们实现了一个jsx转换为dom的库,测试一下:

6.1 将render方法引入到react/index.js文件中

image.png
image.png

6.2 添加React.render方法

在src/index.js文件添加React.render方法:

代码语言:javascript
复制
// src/index
import React from '../react';

const element = (
  <div id="foo">
    <a>bar</a>
    <b />
  </div>
)

React.render(element, document.getElementById('root'))
复制代码

6.3 修改webpack配置

在src目录下添加index.html文件,并添加一个dom属性为id的节点:

image.png
image.png

修改webpack配置,添加html模板:

image.png
image.png
image.png
image.png

6.4 运行

运行命令 npm run start 启动,可以看到已经成功显示出结果:

image.png
image.png

7、总结

使用流程图简单总结一下2、3小节:

image.png
image.png

8、本节代码

代码地址:gitee.com/linhexs/rea…

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、新建react-dom.js文件
  • 2、创建 DOM 节点,然后将新节点添加到容器
  • 3、将 element.props.children 都添加至 dom 节点中
  • 4、处理文本节点
  • 5、为节点绑定属性
  • 6、测试
    • 6.1 将render方法引入到react/index.js文件中
      • 6.2 添加React.render方法
        • 6.3 修改webpack配置
          • 6.4 运行
          • 7、总结
          • 8、本节代码
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档