Day 11:Ref 原理

3 阅读1分钟

Day 11:Ref 原理

核心概念

Ref = React 的"直达车",绕过渲染直接操作 DOM

不用 Ref用 Ref
只能通过状态影响 DOM直接操作 DOM 节点
受 React 管理绕过 React 控制

useRef

function TextInput() {
  const inputRef = useRef(null);
  
  function handleFocus() {
    inputRef.current.focus();
  }
  
  return (
    <div>
      <input ref={inputRef} />
      <button onClick={handleFocus}>聚焦</button>
    </div>
  );
}

useRef vs useState

特性useStateuseRef
变化触发渲染
存储值任意值对象.current
用途需要渲染的数据不需要渲染的数据

forwardRef

让父组件获取子组件的 DOM

// 子组件
const FancyButton = forwardRef((props, ref) => (
  <button ref={ref} className="fancy">
    {props.children}
  </button>
));

// 父组件
function Parent() {
  const buttonRef = useRef(null);
  return <FancyButton ref={buttonRef}>Click</FancyButton>;
}

常见使用场景

场景示例
DOM 操作聚焦、测量尺寸
动画控制 CSS 动画
第三方库D3.js、Three.js
存储上次值访问上一次的 state

自测答案

  1. useRef vs useState:useRef 变化不触发渲染
  2. forwardRef:让父组件访问子组件 DOM
  3. 为什么不变触发渲染:返回稳定引用对象
  4. 典型场景:DOM 操作、动画、第三方库