react18【系列实用教程】useRef —— 创建 ref 对象,获取 DOM (2024最新版)

简介: react18【系列实用教程】useRef —— 创建 ref 对象,获取 DOM (2024最新版)

useRef 的语法

  • 参数为初始值
  • 返回一个可变的 ref 对象,该对象只有一个属性 —— current
const num_obj = useRef(0);

创建了一个 current 属性值为 0 的 ref 对象

{
 current:0
}
  • current 属性值发生变化,不会触发组件更新渲染(此特征与 useState 不同,useState 声明的变量发生变化,会触发组件更新渲染!)
  • 组件更新渲染再次执行 useRef(初始值) 时,不会将 current 属性值恢复为初始值(此特征与 useState 相同!)
  • 修改current 属性值的语句,一般写在 useEffect 或事件处理函数中

useRef 用于获取 DOM

  • useRef 的参数为 null
  • 目标DOM的 ref 属性值为 useRef 的返回值
  • 只能在目标DOM 在页面完成渲染后,才能获取 DOM
  • 目标DOM存在 current 属性里!
import { useRef } from "react";

function Demo() {
  const helloDom = useRef(null);
  const getHelloDom = () => {
    console.log(helloDom.current);
  };
  return (
    <>
      <div ref={helloDom}>你好</div>
      <button onClick={getHelloDom}>获取DOM</button>
    </>
  );
}

export default Demo;

useRef 实现自动计数器

import { useEffect, useRef, useState } from "react";

export default function Father() {
  const [num, setNum] = useState(0);

  const num_obj = useRef(0);

  useEffect(() => {
    let timer = setInterval(() => {
      num_obj.current++;
      setNum(num_obj.current);
    }, 1000);

    return () => clearInterval(timer);
  }, []);

  return (
    <div>
      <h1>自动计数器</h1>
      <p>num为:{num}</p>
    </div>
  );
}

setNum 内不能直接传 num+1,因为依赖项为 [] 的 useEffect 只会在组件挂载时执行一次,在组件更新渲染时不会执行,导致useEffect 内获取到的 num 值永远是 0 ,无法实现预期的持续计数

也不能将 useEffect 的依赖项删除,因为删除后,每次组件更新渲染时,都会执行 useEffect 内的代码,导致持续不断地生成计数器,num 的值会越增越快,最后内存溢出!

  • 自定义普通的数字变量也能实现,但这种写法打破了纯函数的规则,产生了副作用,不推荐使用
import { useEffect, useState } from "react";

export default function Father() {
  const [num, setNum] = useState(0);

  let num_temp = 0;

  console.log("组件渲染", num_temp); //此处一直打印 0

  useEffect(() => {
    let timer = setInterval(() => {
      console.log("定时器内", num_temp); //此处一直打印增加后的值
      num_temp++;
      setNum(num_temp + 1);
    }, 1000);

    return () => clearInterval(timer);
  }, []);

  return (
    <div>
      <h1>自动计数器</h1>
      <p>num为:{num}</p>
    </div>
  );
}

目录
相关文章
|
2月前
|
前端开发 JavaScript
学习react基础(3)_setState、state、jsx、使用ref的几种形式
本文探讨了React中this.setState和this.state的区别,以及React的核心概念,包括核心库的使用、JSX语法、类与函数组件的区别、事件处理和ref的使用。
68 3
学习react基础(3)_setState、state、jsx、使用ref的几种形式
|
2月前
|
前端开发 JavaScript
React中函数式Hooks之useRef的使用
React中函数式Hooks的useRef用于获取DOM元素的引用,示例代码演示了其基本用法。
33 3
|
2月前
|
JavaScript 前端开发
react学习(3)创建虚拟dom的两种方式
react学习(3)创建虚拟dom的两种方式
170 67
|
25天前
|
存储 缓存 JavaScript
深入理解 React-Hooks 之 useRef
【10月更文挑战第20天】总之,`useRef` 是 React-Hooks 中一个非常实用的工具,它为我们提供了一种灵活而强大的方式来处理组件中的各种数据和操作。通过深入理解和掌握 `useRef` 的原理和用法,我们能够更好地构建高效、稳定的 React 应用。
32 6
|
1月前
|
JavaScript 前端开发 算法
React 虚拟 DOM 深度解析
【10月更文挑战第5天】本文深入解析了 React 虚拟 DOM 的工作原理,包括其基础概念、优点与缺点,以及 Diff 算法的关键点。同时,分享了常见问题及解决方法,并介绍了作者在代码/项目上的成就和经验,如大型电商平台的前端重构和开源贡献。
57 3
|
1月前
|
存储 前端开发 JavaScript
React useState 和 useRef 的区别
本文介绍了 React 中 `useState` 和 `useRef` 这两个重要 Hook 的区别和使用场景。`useState` 用于管理状态并在状态变化时重新渲染组件,适用于表单输入、显示/隐藏组件、动态样式等场景。`useRef` 则用于在渲染之间保持可变值而不触发重新渲染,适用于访问 DOM 元素、存储定时器 ID 等场景。文章还提供了具体的代码示例,帮助读者更好地理解和应用这两个 Hook。
40 0
|
2月前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
29 2
|
2月前
|
前端开发
react学习(17)回调形式的ref
react学习(17)回调形式的ref
|
2月前
|
JSON 前端开发 中间件
React读取properties配置文件转化为json对象并使用在url地址中
本文介绍了如何在React项目中读取properties配置文件,将其内容转化为JSON对象,并在请求URL地址时使用这些配置。文章详细说明了异步读取文件、处理字符串转换为JSON对象的过程,并提供了一个封装函数,用于在发起请求前动态生成配置化的URL地址。
77 1
|
2月前
|
JavaScript 前端开发
react字符串转为dom标签,类似于Vue中的v-html
本文介绍了在React中将字符串转换为DOM标签的方法,类似于Vue中的`v-html`指令,通过使用`dangerouslySetInnerHTML`属性实现。
93 0
react字符串转为dom标签,类似于Vue中的v-html