useRef:解读useRef官网文档&使用场景

415 阅读1分钟

一、什么是useRef

image.png useRef会返回一个可变的ref对象,它会把初始化参数绑定到current属性上。当然初始化属性可以通过函数返回。

const UseRefInitialValueFunc = () => {
    const initialValueFunc = () => {
        // ...
        return '初始化数据'
    }
    // 函数返回初始化数据
    const initRef = useRef(initialValueFunc())
    const handleClick = () => {
        console.log(initRef.current) // 初始化数据
    }
   return (<div onClick={handleClick}>点击</div>)
}

二、useRef开发中应用场景

image.png react官网的介绍总是那么晦涩难懂😂😂😂。简单的说:可以通过useRef来获取dom元素,或者class组件实例;

function UseRefGetDom() {
    const inputEl = useRef(null);
    const onButtonClick = () => {
      // `current` 指向已挂载到 DOM 上的文本输入元素
      console.log("inputEl:",inputEl)
      inputEl.current.focus();
    };
    return (
      <>
        <input ref={inputEl} type="text" />
        <button onClick={onButtonClick}>输入框聚焦</button>
      </>
    );
}

image.png useRef获取了input元素,并调用input的focus方法实现输入框聚焦。

其次,useRef 返回的 ref 对象在组件的整个生命周期内保持不变,也就是说每次重新渲染函数组件时,返回的ref 对象都是同一个(使用 React.createRef ,每次重新渲染组件都会重新创建 ref)

 function UseRefDuration() {
    const [state,setState] = useState(0)
    const currentRef = useRef(0)
    const handleClick = () => {
      setState(() => state + 1)
      currentRef.current = currentRef.current + 1
      // state和currentRef.current同时+1。
      // console输出渲染之前state和currentRef.current值;页面显示渲染之后state和currentRef.current值
      console.log("state:",state,"currentRef:",currentRef)
    };
    return (
      <>
        <div>state:{state}</div>
        <div>currentRef.current:{currentRef.current}</div>
        <button onClick={handleClick}>输入框聚焦</button>
      </>
    );
}

结合控制台和页面输出分析:控制台输出渲染之前state和currentRef.current值;页面显示渲染之后state和currentRef.current值。通过useRef保存的属性可以在渲染前后不发生变化,并且改变.current属性不会触发组件渲染! image.png

参考资料:

juejin.cn/post/684490…

segmentfault.com/a/119000002…

blog.csdn.net/qq_39956624…