建立你自己的react(一)----复习

前言

今天开始我们来学习《建立自己的react》系列,我计划用11篇的内容来完整的带领大家创建react的重要内容,希望大家能有所收获

从头开始

我们将从头开始,一步一步的重写react。遵循真正的react代码的体系架构,但不包括所有的优化和非必要的功能。

如果你已经读过我的任何一篇"建立你自己的react"的文章。不同点是这次的文章是基于react 16.8版本。所以我们可以使用hooks,并且放弃所有与类相关的代码。

从头开始,以下的内容我们将一步又一步的添加到我们的react版本中

  • Step I : The createElement Function
  • Step II : The render Function
  • Step III: Concurrent Mode
  • Step IV: Fibers
  • Step V: Render and Commit Phases
  • Step VI: Reconciliation
  • Step VII: Function Components
  • Step VIII: Hooks

第零步: 复习

首先让我们来复习一下基本的概念,如果你已经对react,jsx和dom的工作方式有很好的了解那么你可以跳过这一步

js 复制代码
const element = <h1 title="foo">Hello</h1>
const container = document.getElementById("root")
ReactDOM.render(element, container)

仅仅这三行代码,首先我们定义了一个react element。接下来从dom中获取一个节点。最后一步在container中渲染react element。

让我们删除所有react指定的代码,替换为普通的js代码

在第一行中,我们有这个element,被定义为JSX。它不是一个有效的javascript, 所以为了替换为有效的JavaScript,所以首先我们要替换他为一个有效的js。

jsx通过构建工具babel,转化为普通js。这个转化通常是简单的:通过调用createElement方法替换在标签(标签就是
)的代码。传递标签名,props和子元素作为参数。

js 复制代码
const element = React.createElement(
"h1",
{ title: "foo" },
"Hello"
)

React.createElement会创建一个对象,从他的参数中。除了一些验证,那么他基本就是这样。所以我们可以安全的把函数调用替换为他的输出

js 复制代码
const element = {
    type: "h1",
    props: {
        title: "foo",
        children: "Hello",
    },
}

这就是一个element,包含两个属性,一个是type,一个是props(它可能更多,但我们只需要关心这两个)

这个type是一个我想创建的dom节点的指定类型,是一个字符串。当你想创建一个HTML元素的时候,你可以把这个标签名传给document.createElement。

props是另一个对象,他拥有来自jsx属性的所有key和value。他也有一个指定的属性: children

children在这里是一个字符串,但是它通常是一个拥有很多element的数组,这就是为什么elements也是一个树了。

js 复制代码
ReactDOM.render(element, container)

我们需要替换的另一块react代码是对ReactDOM.render函数的调用。render是React改变dom的地方,所以让我们自己来更新吧。

首先让我们使用element.type来创建一个node节点,这里是h1。

js 复制代码
const node = document.createElement(element.type)

接下来我们赋值所有的props属性在这个node节点上, 这里仅仅有一个title

js 复制代码
node["title"] = element.props.title

为了避免混淆混淆,我将使用element来指定React元素,node指定DOM元素

然后我们在创建一个子节点为了这个children,因为我们子节点是一个文本,所以我们只需要创建一个文本节点。

使用文本节点而不是设置innerText,将允许我们在接下来使用同样的方法处理所有的这种元素。

最后我们append这个文本节点在h1上面并且讲这个h1元素append到container上

js 复制代码
node.appendChild(text)
container.appendChild(node)

现在我们拥有了和使用React一样的应用,但是我们没有使用React。

js 复制代码
const element = {
    type: "h1",
    props: {
        title: "foo",
        children: "Hello",
    },
}

const container = document.getElementById("root")

const node = document.createElement(element.type)
node["title"] = element.props.title

const text = document.createTextNode("")
text["nodeValue"] = element.props.children

node.appendChild(text)
container.appendChild(node)

参考

相关推荐
程序员黑豆4 小时前
Java类型推断完全指南:从var到菱形运算符,掌握使用限制与最佳实践
java·前端·ai编程
To_OC4 小时前
踩了个 TS 的坑之后,我终于把 type 和 interface 掰明白了
前端·react.js·typescript
GreenTea4 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法
浮生望5 小时前
前端API工程化:用 Mock 数据与 Axios 配置实现独立于后端的并行开发
前端
万少5 小时前
给 DeepSeek Harness 装个"应用商店":一条命令,595 个插件随你逛
前端·javascript·后端
波波0075 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
Brown.alexis6 小时前
es6知识点1-自备使用
前端·ecmascript·es6
小爬的老粉丝7 小时前
JavaScript 纯前端预览 WPS:先识别容器,再路由解析器
前端·javascript·wps
计算机魔术师8 小时前
新兴多智能体系统的模式与问题
前端
用户059540174468 小时前
AI Agent 上下文污染踩坑实录:用 pytest + Redis 揪出 3 类记忆串号 bug,排查 6 小时
前端·css