react 中 useRef Hook 作用

**`useRef`**是一个非常实用的钩子函数

一、访问和操作 DOM 元素

1. 获取 DOM 元素引用

1.1 基本原理

通过 `useRef` 我们可以直接操作 DOM 元素

1.2 代码示例

javascript 复制代码
import React, { useRef, useEffect } from "react";



const InputFocusComponent = () => {

  const inputRef = useRef(null);



  useEffect(() => {

    // 组件挂载后,使输入框获得焦点

    if (inputRef.current) {

      inputRef.current.focus();

    }

  }, []);



  return (

    <div>

      <input type="text" ref={inputRef} />

    </div>

  );

};



export default InputFocusComponent;

2. 跨渲染周期保持引用

2.1 渲染周期中的稳定性

例如:在一个定时器的场景中,需要在组件挂载时启动定时器,并在组件卸载时清除定时器,`useRef`可以帮助我们保持对定时器 ID 的引用。

2.2 代码示例

javascript 复制代码
import React, { useRef, useEffect, useState } from "react";



const TimerComponent = () => {

  const timerRef = useRef(null);

  const [count, setCount] = useState(0);



  useEffect(() => {

    // 组件挂载时启动定时器

    timerRef.current = setInterval(() => {

      setCount((prevCount) => prevCount + 1);

    }, 1000);



    return () => {

      // 组件卸载时清除定时器

      if (timerRef.current) {

        clearInterval(timerRef.current);

      }

    };

  }, []);



  return (

    <div>

      <p>Seconds passed: {count}</p>

    </div>

  );

};



export default TimerComponent;

二、保存可变值

1. 避免重新渲染触发的问题

1.2 与 state 的区别

例如:在一个数据获取的场景中,获取数据时不需要触发组件渲染。

1.3 代码示例

javascript 复制代码
import React, { useRef, useState, useEffect } from "react";



const DataFetchingComponent = () => {

  const isFetchingRef = useRef(false);

  const [data, setData] = useState(null);



  useEffect(() => {

    if (!isFetchingRef.current) {

      isFetchingRef.current = true;

      fetch("https://example.com/api/data")

        .then((response) => response.json())

        .then((jsonData) => {

          setData(jsonData);

          isFetchingRef.current = false;

        });

    }

  }, []);



  return (

    <div>

      {data ? (

        <pre>{JSON.stringify(data)}</pre>

      ) : (

        <p>

          {isFetchingRef.current ? "Fetching data..." : "No data available"}

        </p>

      )}

    </div>

  );

};



export default DataFetchingComponent;
相关推荐
福兮说6 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理7 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆6667 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
凤城老人7 小时前
从 PyQt6 到 Electron:给 Edge TTS 做一个“多角色配音机“的踩坑手记
javascript·typescript·electron
Dovis(誓平步青云)8 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan8 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_9 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒9 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技9 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu10 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub