返回

React useState 实现原理剖析,从源码解开其神秘面纱

前端

useState 是 React 中用于状态管理的 Hooks 之一,它允许你以函数式的方式定义组件的状态,从而简化组件的开发和维护。useState 的使用非常简单,只需调用 useState 函数并传入一个初始值,即可创建一个可变的状态变量。

const [state, setState] = useState(initialState);

useState 函数返回一个数组,其中第一个元素是当前的状态值,第二个元素是更新状态的函数。你可以通过调用 setState 函数来更新状态,从而触发组件的重新渲染。

为了更好地理解 useState 的实现原理,我们不妨从源码角度对其进行剖析。useState 的源码位于 React 源码库的 packages/react/src/useState.js 文件中。

export default function useState(initialState) {
  const hook = getHook();
  const state = hook.memoizedState;

  if (isUndef(state)) {
    // 如果状态没有初始化,则使用初始值初始化状态
    hook.memoizedState = state = initialState;
  }

  // 构建一个更新状态的函数
  const updateQueue = {
    last: null,
    dispatch: null,
  };

  const dispatchAction = (queue, action) => {
    const update = {
      action,
      next: null,
    };

    // 将更新动作添加到更新队列中
    if (isUndef(queue.last)) {
      queue.last = queue.dispatch = update;
    } else {
      queue.last.next = update;
      queue.last = update;
    }
  };

  // 构建一个更新状态的函数
  const setState = action => {
    dispatchAction(updateQueue, action);

    // 调度组件重新渲染
    scheduleUpdate();
  };

  return [state, setState];
}

从源码中可以看出,useState 函数主要做了以下几件事:

  1. 获取当前组件的 Hook 对象。
  2. 如果状态没有初始化,则使用初始值初始化状态。
  3. 构建一个更新状态的队列。
  4. 构建一个更新状态的函数。
  5. 返回当前的状态值和更新状态的函数。

当调用 setState 函数更新状态时,会将更新动作添加到更新队列中,然后调度组件重新渲染。

useState 的实现原理并不复杂,但它却非常强大。通过使用 useState,我们可以轻松地管理组件的状态,从而简化组件的开发和维护。

除了 useState 之外,React 还提供了其他几个用于状态管理的 Hooks,比如 useEffect、useReducer 等。这些 Hooks 可以帮助我们轻松地管理组件的状态,从而使 React 开发变得更加简单和高效。