当前位置:首页 > React

自己实现react

2026-01-26 16:11:11React

实现简易 React 核心功能

实现一个简易 React 需要包含虚拟 DOM、组件系统、状态管理和渲染机制。以下是核心功能的实现方法:

虚拟 DOM 结构 虚拟 DOM 是一个轻量级的 JavaScript 对象,描述真实 DOM 结构。定义基础结构如下:

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,
      children: [],
    },
  };
}

渲染函数 将虚拟 DOM 渲染到真实 DOM 需要递归处理节点:

function 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 =>
    render(child, dom)
  );
  container.appendChild(dom);
}

组件系统 实现函数组件和类组件的基础结构:

function createComponent(component, props) {
  if (component.prototype && component.prototype.render) {
    // 类组件处理
    const instance = new component(props);
    return instance.render();
  } else {
    // 函数组件处理
    return component(props);
  }
}

状态管理 实现基础的 useState Hook:

let hookStates = [];
let hookIndex = 0;

function useState(initialState) {
  const currentIndex = hookIndex;
  hookStates[currentIndex] = hookStates[currentIndex] || initialState;

  function setState(newState) {
    hookStates[currentIndex] = newState;
    // 触发重新渲染
    rerender();
  }

  hookIndex++;
  return [hookStates[currentIndex], setState];
}

协调算法(Reconciliation) 实现简单的 diff 算法进行 DOM 更新:

function updateDomProperties(dom, prevProps, nextProps) {
  const isEvent = name => name.startsWith("on");
  const isProperty = name => !isEvent(name) && name !== "children";

  // 移除旧事件监听
  Object.keys(prevProps)
    .filter(isEvent)
    .forEach(name => {
      const eventType = name.toLowerCase().substring(2);
      dom.removeEventListener(eventType, prevProps[name]);
    });

  // 设置新属性
  Object.keys(nextProps)
    .filter(isProperty)
    .forEach(name => {
      dom[name] = nextProps[name];
    });

  // 添加新事件监听
  Object.keys(nextProps)
    .filter(isEvent)
    .forEach(name => {
      const eventType = name.toLowerCase().substring(2);
      dom.addEventListener(eventType, nextProps[name]);
    });
}

实现生命周期方法

为类组件添加基础生命周期支持:

class Component {
  constructor(props) {
    this.props = props;
    this.state = {};
  }

  setState(partialState) {
    this.state = { ...this.state, ...partialState };
    // 触发更新
    scheduleUpdate(this);
  }

  componentDidMount() {}
  shouldComponentUpdate() { return true; }
  componentDidUpdate() {}
  componentWillUnmount() {}
}

实现 Fiber 架构

现代 React 使用 Fiber 架构实现可中断渲染:

function performUnitOfWork(fiber) {
  if (!fiber.dom) {
    fiber.dom = createDom(fiber);
  }

  const elements = fiber.props.children;
  let index = 0;
  let prevSibling = null;

  while (index < elements.length) {
    const element = elements[index];
    const newFiber = {
      type: element.type,
      props: element.props,
      parent: fiber,
      dom: null,
    };

    if (index === 0) {
      fiber.child = newFiber;
    } else {
      prevSibling.sibling = newFiber;
    }

    prevSibling = newFiber;
    index++;
  }

  if (fiber.child) {
    return fiber.child;
  }
  let nextFiber = fiber;
  while (nextFiber) {
    if (nextFiber.sibling) {
      return nextFiber.sibling;
    }
    nextFiber = nextFiber.parent;
  }
}

实现事件系统

React 使用事件委托实现合成事件:

const syntheticEvent = {
  onClick: 'click',
  onChange: 'change',
  // 其他事件映射
};

function addEventListeners() {
  Object.keys(syntheticEvent).forEach(reactName => {
    const domEventName = syntheticEvent[reactName];
    document.addEventListener(domEventName, e => {
      // 实现事件冒泡和合成事件对象
      handleEvent(domEventName, e);
    });
  });
}

function handleEvent(domEventName, nativeEvent) {
  let target = nativeEvent.target;
  while (target) {
    const reactEventName = getReactEventName(domEventName);
    const props = getPropsForElement(target);
    if (props && props[reactEventName]) {
      props[reactEventName](nativeEvent);
    }
    target = target.parentNode;
  }
}

以上实现涵盖了 React 最核心的功能模块。实际生产环境的 React 实现更加复杂,包含性能优化、错误边界、上下文等更多特性。这个简易实现可以帮助理解 React 的工作原理。

自己实现react

标签: react
分享给朋友:

相关文章

react中monent如何获取日期

react中monent如何获取日期

使用 Moment.js 获取当前日期 在 React 中通过 Moment.js 获取当前日期,可以直接调用 moment() 函数。它会返回包含当前日期和时间的 Moment 对象。 impo…

如何降低react版本

如何降低react版本

降低 React 项目版本的步骤 检查当前 React 版本 运行以下命令查看项目中安装的 React 当前版本: npm list react 或 yarn list react 修改…

如何优化react

如何优化react

优化 React 性能的方法 使用 React.memo 或 PureComponent 对于函数组件,使用 React.memo 进行记忆化,避免不必要的重新渲染。类组件可以使用 PureCompo…

如何选购react

如何选购react

选购 React 相关产品或服务的建议 React 是一个用于构建用户界面的 JavaScript 库,广泛应用于前端开发。以下是选购 React 相关产品(如课程、书籍、工具、组件库等)的参考方法:…

react如何部署

react如何部署

部署 React 应用的常见方法 使用静态服务器部署 React 应用在构建后会生成静态文件,可以直接通过静态服务器部署。常用的静态服务器包括 Nginx、Apache 等。 运行构建命令生成静态文…

如何启动react

如何启动react

安装Node.js 确保系统已安装Node.js(建议使用LTS版本),可通过官网下载并安装。安装完成后,在终端运行以下命令验证版本: node -v npm -v 创建React项目 使用官方工具…