react中useRef的使用

news/2024/7/15 18:32:57 标签: react.js, javascript, 前端

useRef 是 React 中的一个 Hook,用于获取 DOM 元素或在组件之间共享不变的数据。

使用 useRef 可以获取任何的 DOM 元素,例如:

javascript">import React, { useRef } from 'react';

function MyComponent() {
  const inputRef = useRef(null);

  const handleClick = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      <input type="text" ref={inputRef} />
      <button onClick={handleClick}>Focus Input</button>
    </div>
  );
}

在上面的例子中,我们使用 useRef 来获取 input 元素,并在按钮点击时调用 focus() 方法来聚焦到 input 上。

除了获取 DOM 元素,useRef 还可以用来在组件之间共享不变的数据。例如:

javascript">import React, { useRef } from 'react';

function MyComponent() {
  const dataRef = useRef({ name: 'John', age: 30 });

  return (
    <div>
      <p>Name: {dataRef.current.name}</p>
      <p>Age: {dataRef.current.age}</p>
    </div>
  );
}

我问chatgpt的问题

javascript">import React, { useRef, useState } from 'react';

function MyComponent() {
const dataRef = useRef({ name: 'John', age: 30 });
const [count, setCount] = useState(1)

return (
<div>
	<p>Name: {dataRef.current.name}</p>
	<p>Age: {dataRef.current.age}</p>
	<p>数字:{count}</p>
	<button onClick={() => {
	dataRef.current.name = 'zhangsan'
	setCount(count+1)
	console.log(dataRef.current.name)
	}}>点击</button>
</div>
);
}
export default MyComponent; 

通过页面实际效果我发现
当我没有setState的时候点击按钮页面useRef的值没有更新(也就是没有触发页面的重新渲染,但是useRef的值是更新了),当我加了setState以后就会页面上useRef的值也更新了。

再来一个对比的例子

javascript">import React, { useRef, useState } from 'react';

function MyComponent() {
let date = '20230704'
const dataRef = useRef({ name: 'John', age: 30 });
const [count, setCount] = useState(1)
return (
<div>
	<p>Name: {dataRef.current.name}</p>
	<p>Age: {dataRef.current.age}</p>
	<p>数字:{count}</p>
	<p>日期:{date}</p>
	<button onClick={() => {
	dataRef.current.name = 'zhangsan'
	date = '20230705'
	setCount(count+1)
	console.log(dataRef.current.name)
	}}>点击</button>
	<button onClick={() => {
	console.log(dataRef.current.name)
	console.log(date)
	}}>获取日期</button>
</div>
);
}
export default MyComponent; 

问题:为什么打印date的值是20230704而不是20230705

答案: 这是因为在React函数组件中,每次状态更新时,整个组件函数将重新执行。在这个例子中,日期date被定义为一个普通的变量,而不是状态变量。当你点击“点击”按钮时,date确实被更新为20230705,但是当组件重新渲染时,MyComponent函数重新执行,date变量又被重新赋值为20230704(假如页面没有重新渲染,我们拿到的就是修改以后的值)。

我之前的做法是把date放到组件外侧定义这个变量,但是假如我们理解了useRef的使用,我们这个时候就可以用useRef.

在组件内部,如果一个变量是使用 useState 或 useRef 定义的,那么它的值会被 React 管理,并且在组件重新渲染时会保留上一次的值,而不是被重新赋值为初始值。

dataRef 是一个使用 useRef 来存储引用的对象。当你在点击按钮时修改了 dataRef.current.name 的值,这个变化不会触发组件的重新渲染,但是页面上的值确实被更新了,因为它们都来自于 dataRef.current 这个对象。

用法

有些数据不需要触发组件的重新渲染,但是又需要在组件中共享或持久化保存。这时候可以使用 useRef 来存储这些数据,然后通过 ref.current 来访问或修改它们。(我们可以不必理解,我们只需要知道什么时候用就可以了)

查看代码地址:
https://codesandbox.io/s/usereftde-shi-yong-antd-5-6-4-forked-nk3szp


http://www.niftyadmin.cn/n/1646481.html

相关文章

JS 基础 01

1.使用JS简单实现图片轮拨 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.lunbo_container{display: flex;flex-direction: column;justify-content: center;align…

Pytorch-tensor的维度变化

引言 本篇介绍tensor的维度变化。维度变化改变的是数据的理解方式&#xff01; view/reshape&#xff1a;大小不变的条件下&#xff0c;转变shapesqueeze/unsqueeze&#xff1a;减少/增加维度transpose/t/permute&#xff1a;转置&#xff0c;单次/多次交换expand/repeat&#…

笔记本外接显示器设置全屏壁纸

方法5&#xff1a;换壁纸&#xff08;但是有重要关键点&#xff01;&#xff09; 这个是我的方法&#xff0c;需要一点运气&#xff0c;就是找到一张和外接显示器分辨率一样的壁纸&#xff0c;或者接近的。 说白了就是换张壁纸。 然后关键点来了 一般我们都是双击打开图片&…

mysql的各种恶心问题

今天链接mysql时遇到几个恶心的问题&#xff0c;折腾了半天才搞定&#xff0c;真是费心。 Python MySQL OperationalError: 1045, "Access denied for user rootlocalhost 一直改个鬼的权限最后是密码的问题好吗

JAVA-WEB dom4j解析XML文件

XML一般都作为配置文件使用&#xff0c;使用Java的IO技术就可以解析不过很麻烦。 可以使用第三方的开发包来处理XML文件&#xff0c;下面来介绍一下。 常见的有三种方式&#xff1a; 1. DOM&#xff1a;需要将整个XML加载到内存解析成一个Document对象&#xff0c;可以进行增…

Pytorch-拼接与拆分

引言 本篇介绍tensor的拼接与拆分。拼接与拆分 catstacksplitchunkcat numpy中使用concat&#xff0c;在pytorch中使用更加简写的 cat完成一个拼接两个向量维度相同&#xff0c;想要拼接的维度上的值可以不同&#xff0c;但是其它维度上的值必须相同。举个例子&#xff1a;还是…

OpenStack学习笔记,未完待续

OpenStack是一个虚拟机管理软件&#xff0c;负责启动和管理虚拟机实例。它硬件配置的最低需求是一台作为控制节点&#xff0c;一台作为计算节点。控制节点上安装OpenStack&#xff0c;计算节点上安装操作系统虚拟机&#xff0c;在计算节点上启动虚拟机实例&#xff0c;然后在虚…

mysql日志配置与分析

由于日志文件是掌握数据库运行状态的重要参考&#xff0c;因此日志文件的维护也有十分重要的意义。mysql的日志类型有二进制日志&#xff0c;错误日志&#xff0c;通用日志&#xff0c;慢查询日志。 模块中添加日志分析log-binmysql_bin // 二进制日志log-error/usr/local/mysq…