react中useRef的使用

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

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

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 还可以用来在组件之间共享不变的数据。例如:

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的问题

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的值也更新了。

再来一个对比的例子

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值