React 如何实现 hooks 使其依赖调用顺序

IT技术 reactjs react-hooks
2021-04-07 21:40:53

React Hooks useState可以将本地状态附加到无状态功能组件,例如

const [name, setName] = useState('tom')
const [age, setAge] = useState(25)

我想知道执行上面两行后本地状态对象树是什么样子的? 钩子规则说明了如何处理状态

React 依赖于调用 Hook 的顺序

或者本地状态根本不是对象树,只是一个数组?

提前致谢!

1个回答

钩子在内部被实现为一个队列,每个钩子由一个节点表示,该节点具有对下一个的引用。

从文档:

每个组件都有一个内部“存储单元”列表。它们只是我们可以放置一些数据的 JavaScript 对象。当您调用像 useState() 这样的 Hook 时,它会读取当前单元格(或在第一次渲染期间对其进行初始化),然后将指针移动到下一个单元格。这就是多个 useState() 调用每个获取独立本地状态的方式。

该架构将类似于

{
  memoizedState: 'A',
  next: {
    memoizedState: 'B',
    next: {
      memoizedState: 'C',
      next: null
    }
  }
}

单个钩子的架构如下。可以在实现中找到

function createHook(): Hook {
  return {
    memoizedState: null,

    baseState: null,
    queue: null,
    baseUpdate: null,

    next: null,
  };
}

让钩子表现得像现在这样的关键属性memoizedStatenext

在每个函数组件调用之前,prepareHooks()将被调用,当前纤程和它在钩子队列中的第一个钩子节点将被存储在全局变量中。这样,每当我们调用钩子函数时,(useXXX())它就会知道在哪个上下文中运行。

更新后finishHooks() 将被调用,其中钩子队列中第一个节点的引用将存储在memoizedState属性中的渲染光纤上

钩子不允许传递名称参数来解决这个问题是有原因的吗?例如,useState("tom", "state_1")并在缺少第二个参数时退回到顺序?甚至可能有一个限制,即所有钩子都应该在第一次渲染时被调用,或者是延迟调用的合理行为?或者它是为了强制在每次渲染时调用所有钩子?(从某种意义上说,钩子名称可以解决排序问题,但有必要在每次渲染时调用所有钩子)
2021-05-26 21:40:53