返回

窥见 React 底层:从手写 createElement 与 render 入门

前端

React 是一个强大的 JavaScript 库,用于构建用户界面。它使用声明式编程范式,使得编写和维护复杂的 UI 变得更加容易。React 的核心概念之一是虚拟 DOM,它是一种与真实 DOM 非常相似的内存中的数据结构,React 通过比较虚拟 DOM 与真实 DOM 之间的差异来更新 UI,从而提高了性能和效率。

为了更好地理解 React 的工作原理,我们将从头开始实现两个核心函数:createElement 和 render。createElement 函数用于创建 React 元素,这些元素是 React 应用中的基本构建块,表示 UI 的组成部分。render 函数则将 React 元素渲染到真实 DOM 中,将 UI 显示在浏览器中。

function createElement(type, props, ...children) {
  return {
    type,
    props: {
      ...props,
      children: children.map((child) => typeof child === "object" ? child : createTextElement(child))
    }
  };
}

function createTextElement(text) {
  return {
    type: "TEXT_ELEMENT",
    props: {
      nodeValue: text
    }
  };
}

function render(element, container) {
  const dom = document.createElement(element.type);

  for (const prop in element.props) {
    if (prop === "children") {
      element.props.children.forEach((child) => render(child, dom));
    } else {
      dom[prop] = element.props[prop];
    }
  }

  container.appendChild(dom);
}

createElement 函数接受三个参数:type、props 和 children。type 是元素的类型,可以是 HTML 元素、自定义组件或其他类型的元素。props 是元素的属性,是一个包含键值对的对象。children 是元素的子元素,可以是其他 React 元素或文本。

render 函数接受两个参数:element 和 container。element 是要渲染的 React 元素,container 是要将元素渲染到的容器元素。

这个简单的实现为我们提供了对 React 工作原理的基本了解。我们还可以通过扩展这个实现来支持更复杂的特性,如事件处理、状态管理和组件生命周期。

希望这篇文章能够帮助你更好地理解 React 的内部机制。如果你对 React 感兴趣,不妨动手尝试一下这个简单实现,加深你的理解。