React Hooks之useRef详解

news/2024/7/15 17:40:43 标签: react.js, Hook, Hooks, useRef, ref

ref="/tags/USEREF.html" title=useRef>useRef_0">一、什么是ref="/tags/USEREF.html" title=useRef>useRef

const refContainer = ref="/tags/USEREF.html" title=useRef>useRef(initialValue);

  • ref="/tags/USEREF.html" title=useRef>useRef 返回一个可变的 ref 对象,其内部只有一个 current 属性被初始化为传入的参数(initialValue)
  • ref="/tags/USEREF.html" title=useRef>useRef 返回的 ref 对象在组件的整个生命周期内持续存在
  • 更新 current 值时并不会触发页面的重新渲染(re-render)
  • ref="/tags/USEREF.html" title=useRef>useRef 会在每次渲染时返回同一个 ref 对象

本质上,ref="/tags/USEREF.html" title=useRef>useRef 就像是可以在其 .current 属性中保存一个可变值的“盒子”。

ref="/tags/USEREF.html" title=useRef>useRef_10">二、ref="/tags/USEREF.html" title=useRef>useRef的使用

ref="/tags/USEREF.html" title=useRef>useRefDOM_11">1. 使用ref="/tags/USEREF.html" title=useRef>useRef获取DOM元素
import { ref="/tags/USEREF.html" title=useRef>useRef, MutableRefObject } from 'react';
const Demo = () => {
  let inputEle: MutableRefObject<any> = ref="/tags/USEREF.html" title=useRef>useRef(null);
  useEffect(() => {
  	console.log(inputEle);
  }, [])

  return (
    <>
     <input ref={ inputEle } type="text" />
     <button onClick={
      () => {
        inputEle.current.focus();
      }
     }>输入框聚焦</button>
    </>
  )
};

export default Demo;

inputEle值如下:
在这里插入图片描述
小结: 通过ref="/tags/USEREF.html" title=useRef>useRef定义inputEle变量,在input 元素上定义ref={inputEle},这样通过inputEle中current保存的值为input DOM 元素,这样就可以操作DOM元素了。

ref="/tags/USEREF.html" title=useRef>useRefDOM_38">2. 使用ref="/tags/USEREF.html" title=useRef>useRef获取子组件中的DOM元素
import { ref="/tags/USEREF.html" title=useRef>useRef } from "react";

const Demo = () => {
  let childRef = ref="/tags/USEREF.html" title=useRef>useRef(null);

  return (
    <>
      <Child ref={ childRef } />
    </>
  );
};

const Child = () => {
  return (
    <>
      <input type="text" />
    </>
  );
}

export default Demo;

当我们给子组件加了ref后,控制台会报以下错误:
Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()?

上述报错的意思是我们不能直接使用ref给子组件,需要forwardRef进行传递转发。

forwardRef: 将父类的ref作为参数传入函数式组件中
React.forwardRef((props, ref) => {})

用法如下:

import { forwardRef, useEffect, ref="/tags/USEREF.html" title=useRef>useRef } from "react";

const Demo = () => {
  let childRef = ref="/tags/USEREF.html" title=useRef>useRef(null);
  useEffect(() => {
    console.log(childRef);
  }, [])

  return (
    <>
      <Child ref={ childRef } />
    </>
  );
};

const Child = forwardRef((props, ref) => {
  return (
    <>
      <input type="text" ref={ ref } />
    </>
  );
})

export default Demo;

childRef值如下:
在这里插入图片描述

ref="/tags/USEREF.html" title=useRef>useRef_98">3. 使用ref="/tags/USEREF.html" title=useRef>useRef获取子组件中的属性和方法

useImperativeHandle(ref, createHandle, [deps]);

useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值,大多数情况下useImperativeHandle 应当与 forwardRef 一起使用:

import {
  forwardRef,
  useEffect,
  useImperativeHandle,
  ref="/tags/USEREF.html" title=useRef>useRef,
  useState,
} from "react";

const Demo = () => {
  let childRef = ref="/tags/USEREF.html" title=useRef>useRef(null);
  useEffect(() => {
    console.log(childRef);
  }, []);

  return (
    <>
      <Child ref={childRef} />
    </>
  );
};

const Child = forwardRef((props, ref: any) => {
  const [num, setNum] = useState(0);
  const handleClick = () => {
    console.log("Hello World!");
  };

  useImperativeHandle(ref, () => {
    return {
      num,
      handleClick,
    };
  });
  return (
    <>
    </>
  );
});

export default Demo;

childRef的值如下:
在这里插入图片描述


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

相关文章

第9天-商品服务(电商核心概念,属性分组开发及分类和品牌的级联更新)

1.电商核心概念 1.1.SPU与SKU SPU&#xff1a;Standard Product Unit&#xff08;标准化产品单元&#xff09; 是商品信息聚合的最小单位&#xff0c;是一组可复用、易检索的标准化信息的集合&#xff0c;该集合描述了一个 产品的特性。 决定商品属性的值 SKU&#xff1a;Stock…

【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化

前言 本章就是我们C中类与对象的终章了&#xff0c;不过本章的难度不大&#xff0c;都是类中一些边边角角的知识&#xff0c;记忆理解就行了&#xff0c;相信经过这么长时间的学习类与对象&#xff0c;你对面向对象也有了更加深的理解&#xff0c;最后我们学习完边边角角的一些…

华为OD机试 - 九宫格按键输入(Python) | 机试算法备考思路

最近更新的博客 华为OD机试 - 招聘(Python) | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 五键键盘 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 热点网络统计 | 备考思路,刷题要点,答疑 【新解法】华为OD机试 - 路灯照明 | 备考思路,刷题要点,答疑 【新解…

金融错配程度/信贷错配程度/资本错配程度/资本资源错配程度(1998-2021年)

数据来源&#xff1a;根据沪深A股上市公司数据进行测算 时间跨度&#xff1a;1998-2021年 区域范围&#xff1a;沪深A股上市公司 指标说明&#xff1a; 参考邵挺(2010)、周煜皓和张胜勇(2014)的研究&#xff0c;运用金融错配负担水平来衡量信贷错配&#xff08;Fd&#xff…

基于分布鲁棒联合机会约束的能源和储备调度(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

从0开始学python -34

Python3 输入和输出-2 读和写文件 open() 将会返回一个 file 对象&#xff0c;基本语法格式如下: open(filename, mode)filename&#xff1a;包含了你要访问的文件名称的字符串值。mode&#xff1a;决定了打开文件的模式&#xff1a;只读&#xff0c;写入&#xff0c;追加等。…

生物医药多组学与生物信息方法介绍

基因组学告诉你可能发生什么&#xff0c;转录组学和蛋白组学告诉你即将发生什么&#xff0c;而代谢组学告诉你正在发生什么 1、多组学与生信方法 生物医学技术的组学包括基因组学、转录组学、蛋白质组学、代谢组学和表观基因组学等。这些组学研究领域通过大量数据的高通量技术…

华为OD机试 - 水仙花数 | 备考思路,刷题要点,答疑 【新解法】

最近更新的博客 【新解法】华为OD机试 - 关联子串 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 停车场最大距离 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 任务调度 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试…