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

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() {
  // ...
  // 不要在渲染期间写入 ref
  myRef.current = 123;
  // ...
  // 不要在渲染期间读取 ref
  return <h1>{myOtherRef.current}</h1>;
}

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

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

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

总结

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


http://www.kler.cn/news/234129.html

相关文章:

  • 无人机应用场景和发展趋势,无人机技术的未来发展趋势分析
  • ubuntu22.04安装部署03: 设置root密码
  • 机器学习简介
  • 2.9 Binance_interface APP 现货交易-限单价平仓
  • MySQL数据库-索引概念及其数据结构、覆盖索引与回表查询关联、超大分页解决思路
  • 人工智能之参数估计
  • 算法学习——LeetCode力扣栈与队列篇1
  • 计算机视觉主要知识点
  • CleanMyMac X 4.14.7帮您安全清理Mac系统垃圾
  • [UI5 常用控件] 08.Wizard,NavContainer
  • 论文笔记:相似感知的多模态假新闻检测
  • Nginx实战:3-日志按天分割
  • python coding with ChatGPT 打卡第19天| 二叉树:合并二叉树
  • 显示器校准软件:BetterDisplay Pro for Mac v2.0.11激活版下载
  • 读书笔记之《运动改造大脑》:运动是最佳的健脑丸
  • 【大厂AI课学习笔记】【1.6 人工智能基础知识】(1)人工智能、机器学习、深度学习之间的关系
  • 二、数据结构
  • golang 集成sentry:http.Client
  • 【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Viterbi译码原理
  • GPT-4登场:多模态能力革新,提升ChatGPT与必应体验,开放API助力游戏革新
  • ZooKeeper分布式锁
  • 【golang】23、gorilla websocket 源码:examples、数据结构、流程
  • 【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
  • Linux满载CPU和运行内存的方法
  • 中文点选识别
  • c#安全-nativeAOT
  • 【java】Hibernate访问数据库
  • 快团团大团长加了微信都不回复怎么回事?如果自己做快团团预算需要多少,团队需要几个人
  • Java 将TXT文本文件转换为PDF文件
  • 前端-Vue項目初始化