当前位置:首页 > JavaScript

js实现reacthooks

2026-02-01 14:28:52JavaScript

js实现reacthooks

js实现reacthooks

实现 React Hooks 的 JavaScript 核心逻辑

React Hooks 的核心是通过闭包和链表管理状态,以下是一个简化版的 useStateuseEffect 实现:

基础 Hook 系统结构

let currentHook = 0;
let workInProgressHook = null;
let isMount = true;

const fiber = {
  memoizedState: null, // 链表头节点
  stateNode: null,
};

useState 简化实现

function useState(initialState) {
  let hook;
  if (isMount) {
    hook = {
      memoizedState: typeof initialState === 'function' 
        ? initialState() 
        : initialState,
      next: null,
      queue: { pending: null },
    };
    if (!fiber.memoizedState) {
      fiber.memoizedState = hook;
    } else {
      workInProgressHook.next = hook;
    }
    workInProgressHook = hook;
  } else {
    hook = workInProgressHook;
    workInProgressHook = workInProgressHook.next;
  }

  let baseState = hook.memoizedState;
  if (hook.queue.pending) {
    let firstUpdate = hook.queue.pending.next;
    do {
      const action = firstUpdate.action;
      baseState = typeof action === 'function' 
        ? action(baseState) 
        : action;
      firstUpdate = firstUpdate.next;
    } while (firstUpdate !== hook.queue.pending.next);
    hook.queue.pending = null;
  }
  hook.memoizedState = baseState;

  return [baseState, dispatchAction.bind(null, hook.queue)];
}

function dispatchAction(queue, action) {
  const update = { action, next: null };
  if (queue.pending === null) {
    update.next = update;
  } else {
    update.next = queue.pending.next;
    queue.pending.next = update;
  }
  queue.pending = update;
}

useEffect 简化实现

function useEffect(callback, deps) {
  const hook = {
    memoizedState: null,
    next: null,
    effect: {
      create: callback,
      deps,
      destroy: undefined,
    },
  };

  if (!fiber.memoizedState) {
    fiber.memoizedState = hook;
  } else {
    workInProgressHook.next = hook;
  }
  workInProgressHook = hook;

  if (!isMount) {
    const prevEffect = workInProgressHook.memoizedState;
    if (deps && deps.some((dep, i) => dep !== prevEffect.deps[i])) {
      prevEffect.destroy?.();
      const effect = { create: callback, deps, destroy: undefined };
      workInProgressHook.memoizedState = effect;
      effect.destroy = effect.create();
    }
  }
}

渲染调度模拟

function schedule() {
  workInProgressHook = fiber.memoizedState;
  currentHook = 0;
  isMount = false;
  // 这里实际会触发组件重新渲染
}

实际使用示例

function Counter() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    console.log(`Count updated to ${count}`);
    return () => console.log('Cleanup');
  }, [count]);

  return {
    click: () => setCount(c => c + 1),
    log: () => console.log(count),
  };
}

// 首次渲染
const counter = Counter(); // 控制台输出: Count updated to 0
counter.click(); // 触发更新
schedule(); // 模拟重新渲染
counter.log(); // 输出: 1

关键实现要点

  1. 链表结构存储:每个 Hook 通过 next 指针形成链表,保证在多次调用时能正确获取对应状态
  2. 队列更新机制:状态更新通过环形链表实现批处理
  3. 依赖比较useEffect 通过浅比较决定是否执行副作用
  4. 执行时机:副作用清理和创建函数在适当时机被调用

注意这仅是简化实现,真实 React 的实现还包含调度器、优先级、错误边界等复杂机制。完整实现可参考 React 源码中的 ReactFiberHooks.js 文件。

标签: jsreacthooks
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js jquery

js jquery

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的JWT令牌…