React 18中hook函数详解之useRef

在上一篇文章《React 18中hook函数详解之useState和useEffect》介绍了react v16.8版本以后,引入的Hooks函数的一些概念,以及useState和useEffect的一些用法。本文将接着上一篇文章着重介绍Hook函数当中常用的另一个函数:useRef。

useRef 是一个 React Hook,它能帮助引用一个不需要渲染的值。

useRef 返回一个只有一个属性的对象:

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

在后续的渲染中,useRef 将返回同一个对象。

一、获取dom元素

最简单的用法,在函数组件中,可以基于useRef获取DOM元素

function App() {const [num, setNum] = useState(0);const btnBox = useRef(null); useEffect(() => {console.log(btnBox.current);}, [num]);return (<div><span>{num}</span><button ref={btnBox} onClick={() => setNum(num + 1)}>按钮</button></div>);
}

在父子组件当中,可以使用useRef在父组件当中获取子组件的实例,进而调用子组件的方法。获取子组件的方法,就要用到另一个hook函数——useImperativeHandle。useImperativeHandle是获取函数子组件内部状态或者方法的hook。

定义一个父组件app.tsx:

import React, { useRef, useEffect } from 'react';
import ChildName from './components/Child';
const parentRef= () => {const domRef = useRef<any>(null);const childRef = useRef<any>(null);useEffect(() => {console.log('ref:deom-init', domRef, domRef.current);console.log('ref:child-init', childRef, childRef.current);});const showChild = () => {console.log('ref:child', childRef, childRef.current);if (childRef.current) {childRef.current.say();}};return (<><div style={{ margin: '100px', border: '2px dashed', padding: '20px' }}><h2>这是外层组件</h2><divonClick={() => {console.log('ref:deom', domRef, domRef.current);domRef.current.focus();domRef.current.value = 'hh';}}aria-hidden="true"><span>这是一个dom节点</span><input ref={domRef} /></div><br /><button onClick={showChild} style={{ marginTop: '20px' }} aria-hidden="true">调用子组件的函数</button><div style={{ border: '1px solid', padding: '10px' }}><ChildName ref={childRef} /></div></div></>);
};export default parentRef;

二、父组件知识点

  1. useRef是一个方法,且useRef返回一个可变的ref对象;
  2. initialValue被赋值给其返回值的.current对象;
  3. 可以保存任何类型的值:dom、对象等任何可变值;
  4. ref对象与自建一个{current:‘’}对象的区别是:useRef会在每次渲染时返回同一个ref对象,即返回的ref对象在组件的整个生命周期内保持不变。自建对象每次渲染时都建立一个新的。
  5. ref对象的值发生改变之后,不会触发组件重新渲染。有一个窍门,把它的改变动作放到useState()之前;
  6. 本质上,useRef就是一个其.current属性保存着一个可变值“盒子”。目前我用到的是pageRef和sortRef分别用来保存分页信息和排序信息;

定义一个子组件Child.tsx:

import React, { useImperativeHandle, forwardRef } from 'react';const ChildName = (_props: any, ref: React.Ref<unknown> | undefined) => {useImperativeHandle(ref, () => ({say: sayHello}));const sayHello = () => {alert('hello,我是子组件');};return <h3>子组件</h3>;
};export default forwardRef(ChildName);

三、子组件知识点

  1. useImperativeHandle(ref,createHandle,[deps])可以自定义暴露给父组件的实例值。如果不使用,父组件的ref(chidlRef)访问不到任何值(childRef.current==null);
  2. useImperativeHandle应该与forwradRef搭配使用;
  3. React.forwardRef会创建一个React组件,这个组件能够将其接受的ref属性转发到其组件树下的另一个组件中;
  4. React.forward接受渲染函数作为参数,React将使用prop和ref作为参数来调用此函数;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/774035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前端面试3+1】01闭包、跨域、路由模式

一、对闭包的理解 定义&#xff1a; 闭包是指在一个函数内部定义的函数&#xff0c;并且该内部函数可以访问外部函数的变量。闭包使得函数内部的变量在函数执行完后仍然可以被访问和操作。 特点&#xff1a; 闭包可以访问外部函数的变量&#xff0c;即使外部函数已经执行完毕。…

2023最新版Android studio安装入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

目录 JDK安装与配置 一、下载JDK 二、JDK安装 三、JDK的环境配置 四、JDK的配置验证 Android studio安装 Android studio连接手机真机调试&#xff08;以华为鸿蒙为例&#xff09; 一、新建一个android项目 二、进入项目面板 三、配置Android Studio 四、安装手机驱…

抽象类和接口(1)(抽象类部分)

抽象类概念 在面向对象的概念中&#xff0c;所有的对象都是通过类来描绘的&#xff0c;但是反过来&#xff0c;并不是所有的类都是用来描绘对象的&#xff0c;如果一个类中没有包含足够的信息来描绘一个具体的对象&#xff0c;这样的类就是抽象类. 此外还有抽象方法这个概念 …

拿到今日现货白银价格 如何开始分析?

很多投资者看到近期现货白银的强劲涨势&#xff0c;并且开户入场。但入场之后&#xff0c;他们发现对如何找到机会还不甚了解。比方说我们拿到今日现货白银价格要如何开始分析呢&#xff0c;很多新入场的投资者根本没有头绪&#xff0c;下面我们就来讨论一下相关的方法。 我们可…

函数 GetMemoryType 的理解

从开始接触Vulkan&#xff0c;有个函数一直不解&#xff0c;今日做一个记录&#xff1a; /*** Get the index of a memory type that has all the requested property bits set** param typeBits Bit mask with bits set for each memory type supported by the resource to r…

2024年3月27号PMP每日三题含答案

2024年3月27号PMP每日三题含答案 1.首席信息官告知项目经理项目使用一个公共文件共享网站的行为违反了公司的安全要求。 项目经理应在下列哪一份文件中找到这项需求&#xff1f; A.项目安全计划 B.事业环境因素 C.组织过程资产 D.项目管理信息系统 1.解析&#xff1a;C 是参考…

Java入门之数据类型

一、数据类型 基本数据类型 &#xff08;1&#xff09;如果要定义“long类型的变量要在数值后面加一个L作为后缀” &#xff08;2&#xff09;如果要定义float类型的变量的时候数据值也要加一个作为后缀 小结&#xff1a; 练习 内容&#xff1a; 姓名&#xff1a;巴巴托斯 &…

【比特币】比特币的奥秘、禁令的深层逻辑与风云变幻

导语&#xff1a; 比特币(Bitcoin)&#xff0c;这个充满神秘色彩的数字货币&#xff0c;自诞生以来便成为各界瞩目的焦点。它背后所蕴含的Mining机制、禁令背后的深层逻辑以及市场的风云变幻&#xff0c;都让人欲罢不能。今天&#xff0c;我们将深入挖掘比特币的每一个角落&…

使用 nohup java - jar 不输出nohup日志

使用 nohup 命令来运行 Java 程序&#xff0c;并且不让输出写入 nohup.out 文件&#xff0c;可以使用重定向操作符 > 将标准输出重定向到 /dev/null 文件中。这样可以将输出丢弃&#xff0c;而不会写入日志文件。下面是具体的命令&#xff1a; nohup java -jar your_progra…

docker将本地镜像pull到阿里云和registry

目录 一、上次到阿里云服务器 1、制作一个带有vim功能的Ubuntu镜像 2、在阿里云上面创建镜像仓库 3、从阿里云仓库中上传和拉取镜像 二、上传镜像到本地私有库registry 1、下载镜像docker registry 2、运行私有库registry&#xff0c;相当于本地有个私有docker hub。 3…

Rust使用feature特性和条件编译,以及常用feature使用说明

Cargo Feature 是非常强大的机制&#xff0c;可以为大家提供条件编译和可选依赖的高级特性&#xff0c;可以为你省下不少的代码量来判断操作系统和条件编译等功能。rust官方条件编译文档&#xff1a;Conditional compilation - The Rust Reference features特性 Featuure 可以…

零基础学习挖掘PHP网站漏洞

教程介绍 本套课程&#xff0c;分为三个阶段&#xff1a;第一阶段&#xff1a;基础篇 学习PHP开发的基础知识&#xff0c;对PHP常见的漏洞进行分析&#xff0c;第二阶段&#xff1a;进阶篇 实战PHP漏洞靶场&#xff0c;了解市面上的PHP主流网站开发技术&#xff0c;并对市面上…

RocketMQ 流数据库解析:如何实现一体化流处理?

作者&#xff1a;林清山&#xff08;隆基&#xff09; 前言&#xff1a; 从初代开源消息队列崛起&#xff0c;到 PC 互联网、移动互联网爆发式发展&#xff0c;再到如今 IoT、云计算、云原生引领了新的技术趋势&#xff0c;消息中间件的发展已经走过了 30 多个年头。 目前&a…

AI+云平台|全闪云底座迎战

AI融万物之势席卷而来 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 行业特点 AI场景中80%以上是小文件&#xff0c;以非结构化数据为…

python-自动化测试- 多接口动态参数设计

什么叫做多接口的动态参数处理&#xff1f; 测试数据都放在excel中管理&#xff0c;每个接口如果有提取的数据就直接放在excel里写好&#xff0c;到时候直接读取出来做响应的提取操作即可。 电商项目&#xff1a; 购物车 token proId skuID等 需要执行多个接口 获取返回值&…

vue 隐藏导航栏和菜单栏,已解决

初始效果&#xff1a; 效果&#xff1a; 出现问题&#xff1a; 解决方法&#xff1a;

Java解决幸运数字

Java解决幸运数字 01 题目 哈沙德数是指在某个固定的进位制当中&#xff0c;可以被各位数字之和整 除的正整数。 例如 126 是十进制下的一个哈沙德数&#xff0c;因为 (126)10 mod (1 2 6) 0; 126 也是8进制下的哈沙德 数&#xff0c;因为(126)10 (176)8&#xff0c;(126)10…

第十四届蓝桥杯省赛Python组真题(未完)

AcWing 4965. 三国游戏 - AcWing 法1&#xff1a;dfs的时间复杂度是2^n 对于每一个我们有选与不选两种 //法1&#xff1a;dfs #include <bits/stdc.h> using namespace std; #define int long long #define x first #define y second typedef pair<int, int> PI…

使用docker-compose搭建wordpress博客

1、从远程仓库拉取worldpress镜像到本地 2、新建一个项目&#xff0c;然后在新建的项目目录里面新建一个docker-compose.yml模版文件。 3、编写docker-compose.yml文件 4、docker-compose up 运行项目。 5、在浏览器测试 使用docker-compose搭建wordpress博客实验成功。

Rust 实战练习 - 1. 输入,输出,环境变量,字符,字符串

目标&#xff1a; 获取程序命令行参数标准输入输出获取环境变量字符串&#xff0c;字符初步学习 cargo传递参数&#xff0c;需要加上-- use std::{env, ffi::OsString, io, io::Write};fn main() {println!("OS Env: {:?} > {:?}", env::current_dir().unwra…