编程语言
首页 > 编程语言> > javascript – React Hooks – 引擎盖下发生了什么?

javascript – React Hooks – 引擎盖下发生了什么?

作者:互联网

我一直在试用React Hooks,它们似乎简化了存储状态等操作.然而,他们似乎通过魔术做了很多事情,我找不到一篇关于他们实际工作方式的好文章.

看起来很神奇的第一件事就是每次调用它返回的setXXX方法时,调用像useState()这样的函数会导致重新渲染你的功能组件吗?

当功能组件甚至无法在Mount / Unmount上运行代码时,useEffect()之类的东西如何伪造componentDidMount?

useContext()实际上如何访问上下文,以及它如何知道哪个组件正在调用它?

而这甚至没有开始涵盖所有已经出现的第三方钩子,如useDataLoader,它允许您使用以下…

const { data, error, loading, retry } = useDataLoader(getData, id)

数据,错误,加载和重试如何在组件发生变化时重新渲染它们?

对不起,很多问题,但我想大多数问题可以归结为一个问题,即:

钩子后面的函数如何实际访问调用它的函数/无状态组件,以便它可以记住重新渲染之间的事情并启动使用新数据的重新渲染?

解决方法:

React钩子利用组件的隐藏状态,它存储在fiber内,光纤是一个对应于组件实例的实体(在更广泛的意义上,因为功能组件不创建实例作为类组件).

它是React渲染器,它为钩子提供对相应上下文,状态等的访问.顺便说一下,它是调用组件函数的React渲染器.因此,它可以将组件实例与在组件函数内部调用的钩子函数相关联.

这段代码解释了它的工作原理:

let currentlyRenderedCompInstance;
const compStates = new Map(); // maps component instances to their states
const compInstances = new Map(); // maps component functions to instances

function useState(initialState) {
  if (!compStates.has(currentlyRenderedCompInstance))
    compStates.set(currentlyRenderedCompInstance, initialState);

  return [
    compStates.get(currentlyRenderedCompInstance) // state
    val => compStates.set(currentlyRenderedCompInstance, val) // state setter
  ];
}

function render(comp, props) {
  const compInstanceToken = Symbol('Renderer token for ' + comp.name);

  if (!compInstances.has(comp))
    compInstances.set(comp, new Set());

  compInstances.get(comp).add(compInstanceToken);

  currentlyRenderedCompInstance = compInstanceToken;

  return { 
    instance: compInstanceToken,
    children: comp(props)
  };
}

与useState如何通过currentlyRenderedCompInstance访问当前呈现的组件实例令牌类似,其他内置挂钩也可以执行此操作并维护此组件实例的状态.

标签:javascript,reactjs,react-hooks
来源: https://codeday.me/bug/20190928/1829804.html