React hooks文档笔记(四) useRef

news/2025/2/25 15:53:28

useRef

当想让组件记住一些信息,又不想触发新的渲染,可以使用ref:总是返回同一个对象。

1. state 和 refs 的比较

refs(普通的 JavaScript 对象)

state

更改时不触发重新渲染

更改时触发重新渲染

可变的——修改/更新current’s value

(修改完立即生效

 ref.current = 5;

  console.log(ref.current); // 5

不可变——必须使用state的setting函数去修改state变量

React 状态的限制(每个渲染的快照,不会同步更新)

useRef(initialValue)  returns

{ current: initialValue }

useState(initialValue) returns ( [value, setValue])

每次更新state,组件会重新渲染

javascript">import { useState } from 'react';

export default function Counter() {
  const [count, setCount] = useState(0);
  function handleClick() {
    setCount(count + 1);
  }
  return (
    <button onClick={handleClick}>
      You clicked {count} times
    </button>
  );
}

 ref.current不要在渲染过程中读取或写入,组件不会随着每次ref增量而重新渲染:

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

export default function Counter() {
  let countRef = useRef(0);
  function handleClick() {
    // This doesn't re-render the component!
    countRef.current = countRef.current + 1;
  }
  return (
    <button onClick={handleClick}>
      You clicked {countRef.current} times
    </button>
  );
}

2. 常见使用场景

A. 存储timeout IDs

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

export default function Chat() {
  let timeoutID = useRef(null);

  function handleSend() {
    timeoutID.current = setTimeout(() => {
      alert('Sent!');
    }, 3000);
  }

  function handleUndo() {
    clearTimeout(timeoutID.current);
  }
}

B. 存储和操纵dom元素(避免更改由 React 管理的 DOM 节点)

  • 基础用法: <div ref={counterRef} />

  • 访问其他组件的dom节点:

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

const MyInput = forwardRef((props, ref) => {

//(可选)限制公开的内容,不让Form组件的ref调用处理其他事件(如修改css)
  const realInputRef = useRef(null);
  useImperativeHandle(ref, () => ({
    // Only expose focus and nothing else
    focus() {
      realInputRef.current.focus();
    },
  }));

  return <input {...props} ref={ref} />;
});

export default function Form() {
  const inputRef = useRef(null);

  function handleClick() {
    inputRef.current.focus();
  }

  return (
    <>
      <MyInput ref={inputRef} />
      <button onClick={handleClick}>
        Focus the input
      </button>
    </>
  );
}

 C. 存储其他对计算jsx非必要的对象


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

相关文章

阿里云短信发送接口实现

使用阿里云短信接口发送验证码 1. 引入依赖 springboot 工程引入web 引入 lombok 关键代码引入 <!--阿里云短信服务--> <dependency><groupId>com.aliyun</groupId><artifactId>dysmsapi20170525</artifactId><version>2.0.23<…

TI AM64x开发板规格书(双核ARM Cortex-A53 + 单/四核Cortex-R5F + 单核Cortex-M4F,主频1GHz)

1 评估板简介 创龙科技TL64x-EVM是一款基于TI Sitara系列AM64x双核ARM Cortex-A53 单/四核Cortex-R5F 单核Cortex-M4F多核处理器设计的高性能评估板&#xff0c;由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证&#xff0c;高性能低功耗&#xff0c;稳…

doker安装RabbitMQ以及用java连接

目录 doker安装&#xff1a; RabitMq安装&#xff1a; java链接 doker安装&#xff1a; 参考链接&#xff08;非常详细&#xff09;&#xff1a; docker安装以及部署_docker bu shuminio_春风与麋鹿的博客-CSDN博客 安装好后开启doker //启动docker服务 systemctl start do…

【计算机网络】数据链路层之随机接入-CSMA/CA协议(无线局域网)

1.概念 2.无线局域网可否实现碰撞检验CD 3.方案 CSMA/CA 碰撞避免 4. 两种帧间间隔 IFS 为什么需要等待DIFS? 为什么需要等待SIFS? 为什么还要退避一段时间才能使用信道&#xff1f; 5.退避算法 使用退避算法的情况 退避算法 举例 6.信道预约 7.虚拟载波监听 8.题目 9.解析 …

<List<Map<String, Object>>> List Map 转 List<T>工具类

工具类&#xff1a; package com.itheima.util;import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util.Map;public class ListMapToBeanUtils {/*** List<Map<String, Object>>转List<T>*/public static &…

记录 windows11 qemu安装 麒麟操作系统的经历

因为本人供职的公司&#xff0c;要求国产化环境很多的软件&#xff0c;同时为了方便docker部署&#xff0c; 所以开启了 qemu虚拟aarch64环境的经历&#xff0c;用的软件如下&#xff1a; 有需要的私信&#xff0c;存在了&#xff0c;阿里云盘&#xff0c;百度云盘没有会员就是…

第45步 深度学习图像识别:Nasnet建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;Nasnet NASNet是由Google Brain团队在2017年提出的一种神经网络架构搜索&#xff08;Neural Architecture Search&#xff0c;简称NAS&#xff09;的结果。NAS是一种用于自动化设计深度学习模型的技术。在NA…

Nacos(一):简介 如何安装 服务注册与发现 集群 权重 与Eureka区别

一、简介 1、应用场景 当服务调用越来越多&#xff0c;服务的地址需要管理起来&#xff0c;并实现动态调用而不是硬编码在接口中。此时需要一个注册中心来帮助我们管理服务。 流程如下&#xff1a; 商品微服务注册IP和端口到注册中心订单微服务先从注册中心获取到商品微服务…