【发布时间】:2019-12-17 08:54:31
【问题描述】:
假设你有这样的事情:
const MyComponent = (props) => {
const refA = React.useRef()
const refB = React.useRef()
const refC = React.useRef()
const [x, setX] = React.useState(true)
const [y, setY] = React.useState([])
return <div>...</div>
}
在伪代码中,当它被多次调用时,它实际上在做什么?他们基本上是这样做的吗?
- 知道
MyComponent即将从函数转换为虚拟树。 - 设置一个全局变量,该变量将在单个程序框架内调用每个
useX挂钩时进行跟踪。 - 为这个组件实例存储每个钩子调用的输出。
- 下次为此组件 ID 调用钩子时,它会从该组件内的最后一次
useX调用中获取最后返回结果的映射。
我问是因为 (a) 它似乎只能通过某种全局变量技巧来完成,并且 (b) 对应的 code 相当复杂且难以解析。
想知道是否可以简要介绍一下 React 如何实现这些神奇的钩子的一些伪代码。
看起来有点像这样,虽然更高级:
let dispatcher = {}
function MyComponent() {
}
function begin() {
dispatcher.component = {
refs: [],
states: []
}
}
function useRef() {
let ref = {}
dispatcher.component.refs.push(ref)
return ref
}
function useState(val) {
let state = val
dispatcher.component.states.push(val)
return state
}
function end() {
dispatcher.component = null
}
我只是不明白它是如何用这种魔法记忆的。
这与知道钩子如何知道它们用于哪个组件的问题不同。这只是我的问题的一个方面,我一般问的是钩子是如何工作的。
【问题讨论】:
-
在内部我认为它使用 reducer 来跟踪组件的状态,并返回一个方法,您可以调用该方法来更新状态。它在理论上是全局的,但仍然在 React 的框架内。我建议你看一下 React 的 Smoosh 模式视频,它突出了关于内部工作原理的大量细节,它非常先进,但一旦你理解它就会非常令人愉悦:youtube.com/watch?v=aS41Y_eyNrU
-
您是在问 (a) hooks 是如何实现的,还是 (b) 在每次调用时会发生什么反应?
-
两者,钩子实际上是如何工作的,这意味着它被调用时会发生什么。渲染部分我不需要知道,主要是钩子是如何工作的。
-
文档中有一个非常高级的描述:reactjs.org/docs/…