React Hooks 的逻辑在哪里?

rad*_*aei 2 javascript reactjs react-hooks

最近我开始阅读 React Hooks 代码,我看到了这一点。

function useState(initialState) {
  var dispatcher = resolveDispatcher();
  return dispatcher.useState(initialState);
}
function useReducer(reducer, initialArg, init) {
  var dispatcher = resolveDispatcher();
  return dispatcher.useReducer(reducer, initialArg, init);
}
function useRef(initialValue) {
  var dispatcher = resolveDispatcher();
  return dispatcher.useRef(initialValue);
}
function useEffect(create, deps) {
  var dispatcher = resolveDispatcher();
  return dispatcher.useEffect(create, deps);
}
function useLayoutEffect(create, deps) {
  var dispatcher = resolveDispatcher();
  return dispatcher.useLayoutEffect(create, deps);
}
function useCallback(callback, deps) {
  var dispatcher = resolveDispatcher();
  return dispatcher.useCallback(callback, deps);
}
function useMemo(create, deps) {
  var dispatcher = resolveDispatcher();
  return dispatcher.useMemo(create, deps);
}
function useImperativeHandle(ref, create, deps) {
  var dispatcher = resolveDispatcher();
  return dispatcher.useImperativeHandle(ref, create, deps);
}
function useDebugValue(value, formatterFn) {
  {
    var dispatcher = resolveDispatcher();
    return dispatcher.useDebugValue(value, formatterFn);
  }
}
Run Code Online (Sandbox Code Playgroud)

调度程序是一个由resolveDispatcher()初始化的对象。

function resolveDispatcher() {
  var dispatcher = ReactCurrentDispatcher.current;

  if (!(dispatcher !== null)) {
    {
      throw Error( "Invalid hook call. Hooks can only be called inside of the body of a function component..." );
    }
  }

  return dispatcher;
}
Run Code Online (Sandbox Code Playgroud)

ReactCurrentDispatcher 是一个具有一个名为 的属性的对象current

var ReactCurrentDispatcher = {
  /**
   * @internal
   * @type {ReactComponent}
   */
  current: null
};
Run Code Online (Sandbox Code Playgroud)

现在我的问题是 React 如何以及在哪里处理 hooks 的逻辑?useImperativeHandle 或 ... 的逻辑在哪里?

AKX*_*AKX 6

一般来说,为了回答这样的问题,我克隆存储库并使用agor git grep

\n
(react) $ git grep useImperativeHandle\n[...]\npackages/react-reconciler/src/ReactFiberHooks.new.js:    useImperativeHandle<T>(\n[...]\n
Run Code Online (Sandbox Code Playgroud)\n

这让我找到了这些映射,例如 \xe2\x80\x93 的代码useImperativeHandle,似乎是 这三个函数

\n

了解它们如何工作以及如何与 React 纤维系统交互是另一个难题。

\n