import { useRef } from 'react';
export default function Form() {
const inputRef = useRef(null);
function handleClick() {
inputRef.current.focus();
}
return (
<>
<input ref={inputRef} />
<button onClick={handleClick}>
Focus the input
</button>
</>
);
}
React实现useRef通过基本概念、原理来介绍。useRef 的基本概念、数据共享层、hooks 的相关知识,阐述useRef 在 mount 和 update 阶段的操作,以及整个 react 的执行流程,包括 render 阶段和 commit 阶段,并介绍了标记和执行 ref 操作的过程。
- 基本概念:
useRef用于获取当前元素属性,有两种定义方式,返回包含current属性的对象。 - 数据共享层:
hook架构有内部数据共享层,通过currentDispatcher.current处理不同阶段调用。 hooks相关:hooks是函数组件和fiber节点沟通的纽带不同阶段的fiber节点有不同处理函数,还解决了确定fiber对应的hook上下文、hook的存在位置、多个hook处理等问题。useRef原理:通过useRef函数创建并返回对象,渲染流程中获取dom实例,在render阶段标记ref,commit阶段挂载dom节点时操作ref。mount阶段:构建hook对象并添加到fiber节点的hook链表,创建保存数据的current对象。update阶段:通过双缓存树机制更新hook对象。- 执行流程:
render阶段构建新的fiber树,commit阶段依据workInProgress树中的变化节点完成DOM操作,包括Before mutation、mutation、layout三个阶段。标记ref在beginWork阶段,执行在commit阶段的mutation和layout阶段。









