首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

从 React 源码彻底搞懂 Ref 的全部 api

可以看到处理原生标签的 fiber 节点时,beginWork 里会走到这个分支: 里面调用 markRef 打了个标记: 前面说的 tag 就是指这个 flags。...就能拿到这个元素了: 而且我们可以发现,他只是对 ref.current 做了赋值,并不管你是用 createRef 创建的、useRef 创建的,还是自己创建的一个普通对象。...我们试验一下: 我创建了一个普通对象,current 属性依然被赋值为 input 元素。 那我们用 createRef、useRef 的意义是啥呢?...commit 阶段会处理 effect 链表,在 mutation 阶段操作 dom 之前会清空 ref,在 layout 阶段会设置 ref,也就是把 fiber.stateNode 赋值给 ref.current...理解了 react 运行流程,包括普通 effect 的流程和 hook 的 effect 的流程,就能彻底理解 React ref 的实现原理。

96340
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    React核心 -- React-Hooks

    :在 DOM 更新完成之后执行某个操作 注意: 有 DOM 操作的副作用 hooks 在 DOM 更新之后执行 执行时机在 useEffect 之前,其他都和 useEffect 都相同 useEffect...useMemo(() => { console.log('ddd') return 2 * num }, [num]) 5. useCallback 作用:跟随状态更新执行 注意: 只有依赖项改变时才执行...给子组件中传递 props 的时候,如果当前组件不更新,不会触发子组件的重新渲染 6. useRef 作用:长久保存数据 注意事项: 返回一个子元素索引,这个索引在整个生命周期中保持不变 对象发生改变时,...不通知,属性变更不重新渲染 保存一个值,在整个生命周期中维持不变 重新赋值 ref.current 不会触发重新渲染 相当于创建一个额外的容器来存储数据,我们可以在外部拿到这个值 当我们通过正常的方式去获取计时器的...id 是无法获取的,需要通过 ref useEffect(() => { ref.current = setInterval(() => { setNum(num => num

    1.2K20

    React核心 -- React-Hooks

    :在 DOM 更新完成之后执行某个操作 注意: 有 DOM 操作的副作用 hooks 在 DOM 更新之后执行 执行时机在 useEffect 之前,其他都和 useEffect 都相同 useEffect...useMemo(() => { console.log('ddd') return 2 * num }, [num]) 5. useCallback 作用:跟随状态更新执行 注意: 只有依赖项改变时才执行...给子组件中传递 props 的时候,如果当前组件不更新,不会触发子组件的重新渲染 6. useRef 作用:长久保存数据 注意事项: 返回一个子元素索引,这个索引在整个生命周期中保持不变 对象发生改变时,...不通知,属性变更不重新渲染 保存一个值,在整个生命周期中维持不变 重新赋值 ref.current 不会触发重新渲染 相当于创建一个额外的容器来存储数据,我们可以在外部拿到这个值 当我们通过正常的方式去获取计时器的...id 是无法获取的,需要通过 ref useEffect(() => { ref.current = setInterval(() => { setNum(num => num

    1.3K10

    104.精读《Function Component 入门》

    对于本次的例子,useEffect 共执行了 四次,经历了如下四次赋值最终变成 3: currentCount.current = 0; // 第 1 次渲染 currentCount.current...(() => { ref.current = value; }, [value]); return ref; } 这里又引出一个新的概念,就是 useEffect 的第二个参数,dependences...dependences 这个参数定义了 useEffect的依赖,在新的渲染中,只要所有依赖项的引用都不发生变化,useEffect 就不会被执行,且当依赖项为 [] 时,useEffect 仅在初始化执行一次...首先看这一段: useEffect(() => { ref.current = fn; }, [fn, ...dependencies]); 当 fn 回调函数变化时, ref.current 重新指向最新的...重点是,当依赖 dependencies 变化时,也重新为 ref.current 赋值,此时 fn 内部的 dependencies 值是最新的,而下一段代码: return useCallback(

    1.8K20
    领券