当前位置: 首页 > news >正文

react 中 useRef Hook 作用

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

一、访问和操作 DOM 元素

1. 获取 DOM 元素引用

1.1 基本原理

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

1.2 代码示例

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 代码示例

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 代码示例

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;

http://www.lryc.cn/news/485822.html

相关文章:

  • Scala-键盘输入(StdIn)-用法详解
  • 力扣(LeetCode)283. 移动零(Java)
  • ESP32C3单片机使用笔记---烧录MicroPython
  • Matter1.4重磅来袭,智能家居进入“互联”新纪元
  • tdengine学习笔记
  • 机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望
  • Linux 进程信号的产生
  • CentOS8 在MySQL8.0 实现半同步复制
  • 数据分析——Python绘制实时的动态折线图
  • 【Redis】Redis的一些应用场景及使用策略
  • CentOS 8 安装 chronyd 服务
  • HarmonyOS ArkUI(基于ArkTS) 常用组件
  • 不用来回切换,一个界面管理多个微信
  • MySQL系统优化
  • 若依笔记(八):芋道的Docker容器化部署
  • 前端隐藏元素的方式有哪些?HTML 和 CSS 中隐藏元素的多种方法
  • sqli—labs靶场 5-8关 (每日4关练习)持续更新!!!
  • 【Java】异常处理实例解析
  • flutter调试
  • 使用Web Workers提升JavaScript的并行处理能力
  • 【含开题报告+文档+PPT+源码】基于Spring Boot智能综合交通出行管理平台的设计与实现
  • STM32寄存器结构体详解
  • 如何建立devops?
  • shell基础(3)
  • 2024年11月16日Github流行趋势
  • k8s更新
  • ES6进阶知识一
  • C#/WinForm拖拽文件上传
  • IT运维的365天--019 用php做一个简单的文件上传工具
  • 详细的oracle rac维护命令集合