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

hook函数——useRef

useRef

useRef 是一个 React Hook,它能帮助引用一个不需要渲染的值。也就是说useRef可以存储一个值,但是不被组件渲染,仅仅只是引用,主要包括两个方面,例如使用ref引用一个值,使用ref引用一个dom节点,本文将会从计数器文本框聚焦的案例来进一步说明这useRef的用法

const ref = useRef(initialValue)

  • initialValue:ref 对象的 current 属性的初始值。可以是任意类型的值。
  • current:初始值为传递的 initialValue。之后可以将其设置为其他值。如果将 ref 对象作为一个 JSX 节点的 ref 属性传递给 React,React 将为它设置 current 属性。

1.使用ref引用一个值

在这个计数器案例中,我们使用了useRef来引用一个变量ref,初始值为0,ref.current代表引用当前ref的值,在点击后获取到当前的值再加1,按道理来说组件应该渲染{ref.current},但是因为useRef的特点,他只在组件初始渲染的时候显示一次,后续便不会参与渲染,仅仅只是作为当前值的引用,通过current属性获取到值,可以从结果图中看到,渲染的值没有变,组件中的ref也没有变

import { useRef } from 'react';
import './App.css';
function App() {const ref = useRef(0);function handleClick() {ref.current = ref.current + 1;alert('You clicked ' + ref.current + ' times!');}return (<div className="App"><button onClick={handleClick}>点击!</button><p>{ref.current}</p></div>);
}export default App;

在这里插入图片描述
在这里插入图片描述

2.使用ref引用dom节点

在这里使用useRef来引用输入框dom节点,初始设置为空,给输入框绑定一个ref属性,点击按钮之后将引用当前的dom进行聚焦,可以看见组件的ref上有输入框的dom,并且点击之后输入框聚焦

import { useRef } from 'react';
import './App.css';function App() {const inputRef = useRef<HTMLInputElement>(null);const handleClick = () => {if (inputRef.current) {inputRef.current.focus();}}return (<div className="App"><input ref={inputRef} /><button onClick={handleClick}>聚焦输入框</button></div>);
}export default App;

在这里插入图片描述

3.注意事项

不要在渲染期间写入或者读取 ref.current。

React 期望组件主体 表现得像一个纯函数:

如果输入的(props、state 与 上下文)都是一样的,那么就应该返回一样的 JSX。
以不同的顺序或用不同的参数调用它,不应该影响其他调用的结果。
在 渲染期间 读取或写入 ref 会破坏这些预期行为。

function MyComponent() {// ...// 不要在渲染期间写入 refmyRef.current = 123;// ...// 不要在渲染期间读取 refreturn <h1>{myOtherRef.current}</h1>;
}

可以在 事件处理程序或者 Effect 中读取和写入 ref。

function MyComponent() {// ...useEffect(() => {// 可以在 Effect 中读取和写入 refmyRef.current = 123;});// ...function handleClick() {// 可以在事件处理程序中读取和写入 refdoSomething(myOtherRef.current);}// ...
}

如果不得不在渲染期间读取 或者写入,那么应该 使用 state 代替。

总结

这是关于useRef的基础讲解,详细请参考官方文档官方文档

相关文章:

  • LabVIEW工业监控系统
  • 【Linux】Ubuntu 22.04 升级 nodejs 到 v18
  • 伪装成NodeJS的勒索病毒,勒索呼伦贝尔的空气
  • Linux运行级别 | 管理Linux服务
  • 【Linux系统学习】2.Linux基础命令
  • 华为配置内部人员接入WLAN网络示例(802.1X认证)
  • 《杨绛传:生活不易,保持优雅》读书摘录
  • 【计算机网络】时延,丢包,吞吐量(分组交换网络
  • scss和less的区别
  • 【蓝桥杯冲冲冲】k 短路 / [SDOI2010] 魔法猪学院
  • 2.9日学习打卡----初学RabbitMQ(四)
  • 双指针-two pointers的应用
  • C++笔记之regex(正则表达式)
  • 线性表的插入
  • 移动端web开发布局
  • @jsonView过滤属性
  • [笔记] php常见简单功能及函数
  • Android 架构优化~MVP 架构改造
  • crontab执行失败的多种原因
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • eclipse(luna)创建web工程
  • Git初体验
  • JAVA_NIO系列——Channel和Buffer详解
  • JavaScript标准库系列——Math对象和Date对象(二)
  • js 实现textarea输入字数提示
  • SQLServer之创建数据库快照
  • 技术:超级实用的电脑小技巧
  • 坑!为什么View.startAnimation不起作用?
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​io --- 处理流的核心工具​
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • $.proxy和$.extend
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (译)2019年前端性能优化清单 — 下篇
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .net 受管制代码
  • @SuppressWarnings注解
  • [] 与 [[]], -gt 与 > 的比较
  • [Bugku]密码???[writeup]
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [C++随笔录] 红黑树
  • [ccc3.0][数字钥匙] UWB配置和使用(二)
  • [HNOI2008]水平可见直线
  • [LeetCode]—Copy List with Random Pointer 深度复制带“任意指针”的链表
  • [linux] shell中的()和{}
  • [NOIP2005]过河
  • [Operating System] {ud923} P4L4: Datacenter Technologies
  • [Python]—Linux Server 系统监控程序
  • [Spring Cloud] gateway全局异常捕捉统一返回值
  • [Step By Step]SAP HANA创建属性视图(Attribute View)
  • [tarjan][hdu 1269]
  • [VSCode] VSCode 常用快捷键