react Ref 的基本使用
类组件中使用ref
在类组件中,你可以使用createRef
来创建一个ref,并将它附加到DOM元素或类组件实例上。使用ref允许你在类组件中访问和操作特定的DOM元素或类组件实例。
下面是在类组件中使用ref的步骤:
- 引入
React
和createRef
:
在类组件文件的顶部,你需要从React中导入React
和createRef
。
import React, { Component, createRef } from 'react';
- 创建ref:
使用createRef
来创建一个ref对象。
class MyClassComponent extends Component {constructor(props) {super(props);this.myRef = createRef();}// ...
}
在上面的例子中,我们在类组件MyClassComponent
的构造函数中创建了一个ref(myRef
)。
- 绑定ref到DOM元素或类组件实例:
将创建的ref(myRef
)绑定到你想要引用的DOM元素或类组件实例上。在类组件中,你可以使用ref
属性来实现这一点。
class MyClassComponent extends Component {constructor(props) {super(props);this.myRef = createRef();}render() {return <input ref={this.myRef} />;}
}
在上面的例子中,我们将ref(myRef
)绑定到了一个input
元素上。
- 在类组件中使用ref:
现在,你可以在类组件的其他方法中通过this.myRef.current
来访问和操作引用的DOM元素或类组件实例。
class MyClassComponent extends Component {constructor(props) {super(props);this.myRef = createRef();}handleButtonClick = () => {if (this.myRef.current) {this.myRef.current.focus();}};render() {return (<div><input ref={this.myRef} /><button onClick={this.handleButtonClick}>Focus Input</button></div>);}
}
在上面的例子中,我们创建了一个按钮点击事件handleButtonClick
,当按钮被点击时,会调用this.myRef.current.focus()
来将焦点设置到input
元素上。
通过这种方式,你可以在类组件中使用ref来引用和操作特定的DOM元素或类组件实例。
hooks组件中使用ref
在 React Hooks 组件中,你可以使用useRef
来创建并使用 ref。useRef
是一个 Hooks 函数,它允许你在函数组件中保持可变的数据,类似于在类组件中使用实例属性。ref 在许多情况下很有用,例如访问 DOM 元素、存储任意值等。
使用useRef
的步骤如下:
- 引入
useRef
:
在组件文件中,首先需要从 React 中导入useRef
:
import React, { useRef } from 'react';
- 创建 ref:
使用useRef
来创建一个 ref 对象:
const myRef = useRef(initialValue);
其中,initialValue
是 ref 的初始值。
- 将 ref 绑定到 DOM 元素:
将myRef
绑定到你想要引用的 DOM 元素上。这通常通过在 JSX 中的ref
属性中传递myRef
来实现:
<input ref={myRef} />
- 在组件中使用 ref:
你可以在组件中通过myRef.current
来访问 ref 的当前值。这是一个可变的对象,可以用于存储和读取任何数据。
const MyComponent = () => {const inputRef = useRef(null);const handleButtonClick = () => {if (inputRef.current) {inputRef.current.focus();}};return (<div><input ref={inputRef} /><button onClick={handleButtonClick}>Focus Input</button></div>);
};
在上面的例子中,我们创建了一个 input 元素的 ref,并在按钮点击事件中使用inputRef.current.focus()
来将焦点设置到 input 元素上。
需要注意的是,useRef
返回的myRef.current
属性在组件的整个生命周期中保持不变,但是其内部的值可以在不重新渲染组件的情况下发生变化。这使得useRef
适用于存储在组件渲染期间需要跨渲染保持不变的数据。
自定义组件ref
当你在React中创建自定义组件时,如果想在父组件中使用ref引用子组件,你需要使用forwardRef
方法。forwardRef
允许你将ref从父组件传递到子组件中。
下面是使用forwardRef
的步骤:
- 在子组件中使用
forwardRef
方法:
在子组件中使用forwardRef
方法来传递ref,并将它与子组件的DOM元素或其他需要引用的元素绑定起来。同时,确保在组件定义中的第二个参数(通常称为ref
)中接收传递的ref。
import React, { forwardRef } from 'react';const CustomChildComponent = forwardRef((props, ref) => {return <input ref={ref} />;
});
在上面的例子中,我们创建了一个名为CustomChildComponent
的自定义子组件,并在其中使用forwardRef
来传递ref
参数,并将它绑定到了input
元素上。
- 在父组件中使用ref:
现在,你可以在父组件中使用CustomChildComponent
并将一个ref传递给它。这样,父组件就可以引用子组件内部的input
元素。
import React, { useRef } from 'react';
import CustomChildComponent from './CustomChildComponent';const ParentComponent = () => {const inputRef = useRef(null);const handleButtonClick = () => {if (inputRef.current) {inputRef.current.focus();}};return (<div><CustomChildComponent ref={inputRef} /><button onClick={handleButtonClick}>Focus Input</button></div>);
};
在上面的例子中,我们在父组件中创建了一个ref(inputRef
),并将它传递给CustomChildComponent
作为ref
属性。现在,我们可以在handleButtonClick
函数中使用inputRef.current.focus()
来将焦点设置到子组件中的input
元素上。
通过这样的方法,你就可以在自定义组件中使用ref,并从父组件中控制子组件内部的DOM元素或组件实例。
自定义Hooks组件想向外暴露一些方法
如果你希望自定义组件使用ref时向外暴露一些方法,可以通过在子组件内部创建一个ref,并将它与需要暴露的方法关联。然后,将这个ref作为一个对象,包含暴露的方法,传递给父组件。这样,父组件就可以通过ref调用子组件暴露的方法。
下面是一个示例:
- 子组件中创建ref和暴露方法:
import React, { forwardRef, useRef, useImperativeHandle } from 'react';const CustomChildComponent = forwardRef((props, ref) => {const inputRef = useRef(null);// 暴露给父组件的方法const focusInput = () => {if (inputRef.current) {inputRef.current.focus();}};// 使用 useImperativeHandle 将方法暴露给父组件useImperativeHandle(ref, () => ({focusInput: focusInput}));return <input ref={inputRef} />;
});
在上面的例子中,我们创建了一个ref(inputRef
)来引用input
元素,并定义了一个focusInput
方法用于将焦点设置到input
元素上。然后,我们使用useImperativeHandle
将focusInput
方法暴露给父组件。
- 在父组件中使用子组件的暴露方法:
import React, { useRef } from 'react';
import CustomChildComponent from './CustomChildComponent';const ParentComponent = () => {const childComponentRef = useRef(null);const handleButtonClick = () => {if (childComponentRef.current) {childComponentRef.current.focusInput();}};return (<div><CustomChildComponent ref={childComponentRef} /><button onClick={handleButtonClick}>Focus Input</button></div>);
};
在上面的例子中,我们在父组件中创建了一个ref(childComponentRef
),并将其传递给CustomChildComponent
。在父组件中的handleButtonClick
函数中,我们可以通过childComponentRef.current.focusInput()
调用子组件中暴露的focusInput
方法,将焦点设置到子组件的input
元素上。
通过这种方式,你可以在自定义组件中使用ref,并将一些方法暴露给父组件,使父组件可以调用子组件的特定功能。
相关文章:
react Ref 的基本使用
类组件中使用ref 在类组件中,你可以使用createRef来创建一个ref,并将它附加到DOM元素或类组件实例上。使用ref允许你在类组件中访问和操作特定的DOM元素或类组件实例。 下面是在类组件中使用ref的步骤: 引入React和createRef: …...

宝塔面板点击SSL闪退打不开怎么解决?
宝塔Linux面板点击SSL证书闪退如何解决?旧版本的宝塔Linux面板确实存在这种情况,如何解决?升级你的宝塔Linux面板即可。新手站长分享宝塔面板SSL闪退的解决方法: 宝塔面板点击SSL证书闪退解决方法 问题:宝塔Linux面板…...

如何将安卓 Gradle 模块打包发布到本地 Maven 仓库
文章目录 具体流程 笔者的运行环境: Android Studio Flamingo | 2022.2.1 Android SDK 33 Gradle 8.0.1 JDK 17 Android 的 Gradle 项目与一般的 Gradle 项目是不同的,因此对将 Gradle 模块打包发布到本地 Maven 仓库来说,对普通 Gradle …...

【Docker】Docker比虚拟机快的原因、ubuntu容器、镜像的分层概念和私有库的详细讲解
🚀欢迎来到本文🚀 🍉个人简介:陈童学哦,目前学习C/C、算法、Python、Java等方向,一个正在慢慢前行的普通人。 🏀系列专栏:陈童学的日记 💡其他专栏:CSTL&…...

java.lang.IllegalArgumentException: Invalid character found in methodname
postman请求异常:java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens...

【PCB专题】Allegro高速电路Xnet网络等长约束——SDIO信号为例
高速PCB板布线过程中,经常遇到等长设置问题,例如DDR的一组数据线和地址线等。但是由于数据线和地址线中间有一个电阻(或排阻),这种情况下设置等长就要引入Xnet的概念,通过设置Xnet的等长来确保数据线和地址线的等长。 由无源、分立器件(电阻、电容、电感)连接起来的几段…...

leetcode每日一练-第278题-第一个错误的版本
一、思路 二分查找——因为它可以快速地将版本范围缩小一半,从而更快地找到第一个坏版本。 二、解题方法 维护一个左边界 left 和一个右边界 right,在每一步循环中,我们计算中间版本 mid,然后检查它是否是坏版本。如果是坏版本…...
最小生成树笔记(Prim算法Kruskal算法)
1.最小生成树 最小生成树(Minimum Spanning Tree,简称MST)是指:在一个连通无向图中,找到一个包含所有顶点的树,且该树的所有边的权重之和最小。 换句话说,最小生成树是原图中的一个子图&#…...
4、数据清洗
4、数据清洗 前面我们处理的数据实际上都是已经被处理好的规整数据,但是在大数据整个生产过程中,需要先对数据进行数据清洗,将杂乱无章的数据整理为符合后面处理要求的规整数据。 数据去重 1.删除重复数据groupby().count():可以…...

Python-OpenCV 图像的基础操作
图像的基础操作 获取图像的像素值并修改获取图像的属性信息图像的ROI区域图像通道的拆分及合并图像扩边填充图像上的算术运算图像的加法图像的混合图像的位运算 获取图像的像素值并修改 首先读入一副图像: import numpy as np import cv2# 1.获取并修改像素值 # 读…...
test111
step3:多线程task 首先,实现两个UserService和AsyncUserService两个服务接口: package com.example.demospringboot.service;public interface UserService {void checkUserStatus(); }package com.example.demospringboot.service.impl;im…...

17. Spring 事务
目录 1. 事务定义 2. MySQL 中的事务使用 3. 没有事务时的插入 4. Spring 编程式事务 5. Spring 声明式事务 5.1 Transactional 作用范围 5.2 Transactional 参数说明 5.3 Transactional 工作原理 1. 事务定义 将⼀组操作封装成一个执行单元(封装到一起…...

【C# 基础精讲】运算符和表达式
在C#编程中,运算符和表达式是构建复杂逻辑的关键元素。运算符用于执行各种数学、逻辑和其他操作,而表达式则由运算符、变量、常量和函数组成,用于生成计算结果。本文将详细介绍C#中常见的运算符和表达式的概念,以及它们在程序中的…...
【搜索】DFS连通性模型
算法提高课笔记 目录 迷宫题意思路代码 红与黑题意思路代码 DFS 的搜索分为两大部分: 内部搜索:一个图中从一个点搜到另一个点外部搜索:从一张图(状态)搜到另一张图(状态) 在第一个部分里是图…...

项目优化后续 ,手撸一个精简版VUE项目框架!
之前说过项目之前用的vben框架,在优化完性能后打包效果由原来的纯代码96M变成了56M,后续来啦,通过更换框架,代码压缩到了36M撒花~ 现在就来详细说说是怎么手撸一个框架的! 方案: 搭建一套 vite vue3 a…...

【深度学习笔记】TensorFlow 基础
在 TensorFlow 2.0 及之后的版本中,默认采用 Eager Execution 的方式,不再使用 1.0 版本的 Session 创建会话。Eager Execution 使用更自然地方式组织代码,无需构建计算图,可以立即进行数学计算,简化了代码调试的过程。…...
面试题-springcloud中的负载均衡是如何实现的?
一句话导读 Springcloud中的负载均衡是通过Ribbon实现的,自带有很多负载均衡策略,如:包括轮询(Round Robin)、随机(Random)、加权轮询(Weighted Round Robin)、加权随机&…...
flink的ProcessWindowFunction函数的三种状态
背景 在处理窗口函数时,ProcessWindowFunction处理函数可以定义三个状态: 富函数getRuntimeContext.getState, 每个key每个窗口的状态context.windowState(),每个key的状态context.globalState,那么这几个状态之间有什么关系呢? …...

day50-springboot+ajax分页
分页依赖: <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.0.0</version> </dependency> 配置: …...

Win7 专业版Windows time w32time服务电脑重启后老是已停止
环境: Win7 专业版 问题描述: Win7 专业版Windows time w32time服务电脑重启后老是已停止 解决方案: 1.检查启动Remote Procedure Call (RPC)、Remote Procedure Call (RPC) Locator,DCOM Server Process Launcher这三个服务是…...

【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...