/** * 必须要react和react-dom 16.7以上 */ import React, { useState, useEffect } from ‘react‘ export default () => { const [name, setName] = useState(‘zhangsan‘) return ( <> <p>My Name is: {name}</p> <input type="text" value={name} onChange={e => setName(e.target.value)} /> </> ) }
这是一个非常非常简单的 demo , 首先要使用 hooks ,必须要react和react-dom 16.7以上。我们这里声明了一个 function component , 在以前对比 class component , 他缺少的是什么,缺少的就是 this 对象。他没有 this 对象,就没有 this.state , 就不具有包含自己本身的状态的功能,第二个,他不能有生命周期方法,这是最明显的几个特点,在这里,我们使用了 hooks 来存储了state
const [name, setName] = useState(‘zhangsan‘)
useEffect(() => { console.log(‘component update‘) return () => { console.log(‘unbind‘) } }, [])
function resolveDispatcher() { const dispatcher = ReactCurrentOwner.currentDispatcher; invariant( dispatcher !== null, ‘Hooks can only be called inside the body of a function component.‘, ); return dispatcher; } export function useState<S>(initialState: (() => S) | S) { const dispatcher = resolveDispatcher(); return dispatcher.useState(initialState); }
我们看到 useState 里面有个 dispatcher,这个 useState 的返回值是 dispatcher.useState 。这个 dispatcher 是调用了 resolveDispatcher(). 在方法 resolveDispatcher 里面看到这个 dispatcher 是通过 ReactCurrentOwner.currentDispatcher 获取的。这就是涉及后续渲染的时候才会去赋值这些东西。因为在 react 使用阶段是没有拿到任何节点。在 createElement 的时候传入的是对象,还没真正渲染,还没真正的创建这个实例。 ReactCurrentOwner 是个全局的类,
const ReactCurrentOwner = { /** * @internal * @type {ReactComponent} */ current: (null: null | Fiber), currentDispatcher: (null: null | Dispatcher), };
这就是 ReactCurrentOwner 的源码,非常简单,就是一个全局的对象。里面有两个属性,一个是 current , 就是目前渲染的是哪个节点,这个实力。currentDispatcher 就是实力对应的 dispatcher。 useEffect 类似于 useState。
原文:https://www.cnblogs.com/wzndkj/p/11959909.html