创建 Refs 的几种方式
Refs 提供了一种方式,允许我们访问 DOM 节点或在 render 方法中创建的 React 元素。
到目前为止,我们有三种方式创建 Refs 。
1
回调 Refs
2
createRef API 的方式
3
使用 useRef() hook
回调 Refs
现在有一段代码,需要实现的功能是点击 button 按钮然后给 input 表单获取焦点。代码结构如下:
import React, { Component } from "react";
class CallbackRefExample extends Component {
constructor(props) {
super(props);
}
render() {
return (
<div>
回调 Refs:
<br />
<input type="text" />
<button>Click</button>
</div>
);
}
}
export default CallbackRefExample;
要实现这个功能,首先需要创建一个回调函数,并通过 ref 属性附加到 React 元素。然后给按钮绑定点击事件即可。
import React, { Component } from "react";
class CallbackRefExample extends Component {
constructor(props) {
super(props);
this.inputElementRef = this.inputElementRef.bind(this);
this.handleClick = this.handleClick.bind(this);
}
inputElementRef(inputElement) {
this.inputRef = inputElement;
}
handleClick() {
this.inputRef.focus();
}
render() {
return (
<div>
回调 Refs :
<br />
<input type="text" ref={this.inputElementRef} />
<button onClick={this.handleClick}>
Click
</button>
</div>
);
}
}
export default CallbackRefExample;
React 将在组件挂载时,会调用 ref 回调函数并传入 DOM 元素,当卸载时调用它并传入 null。
在 componentDidMount 或 componentDidUpdate 触发前,React 会保证 refs 一定是最新的。
createRef API 的方式
在 React 16.3 版本中新增 React.createRef() API 用来创建 Refs 。我们不需要再创建回调函数并将其分配给ref prop。只需通过 React.createRef() 创建一个 ref 并将其存储到某个变量中,然后将此变量分配给DOM元素的ref prop。因此,我们将以相同的示例为例。
import React, { Component } from "react";
export default function CallbackRefApiExample() {
let inputRef = React.createRef();
const handleClick = () => {
inputRef.current.focus();
};
return (
<div>
createRef API 的方式:
<br />
<input type="text" ref={inputRef} />
<button onClick={handleClick}>
Click
</button>
</div>
);
}
当 ref 被传递给 render 中的元素时,对该节点的引用可以在 ref 的 current 属性中被访问。
使用 useRef() hook
Hook 是 React 16.8 的新增特性。React 提供了 React 中内置的 Hook API。useRef 是其中一个,用法类似于React.createRef()。
import React, { useRef } from "react";
export default function UseRefHookExample() {
let inputRef = useRef(null);
const handleClick = () => {
inputRef.current.focus();
};
return (
<div>
使用 useRef() hook:
<br />
<input type="text" ref={inputRef} />
<button onClick={handleClick}>
Click
</button>
</div>
);
}
End
创建 Refs 的几种方式相关推荐
- java多线程w3c_Java创建多线程的三种方式
前言 这篇文章主要讲述线程的概念.组成.Java创建多线程的三种方式以及线程的类型. 线程概念 线程和进程的区别 **进程:**正在运行的程序,例如:你打开 的qq音乐.exe程序,其由PCB(进程控 ...
- Spring注解创建Bean的几种方式
Spring注解创建Bean的几种方式 1.@Component系列 @Component @Service @Repository @Controller @Configuration 2. 依附于 ...
- 【并发编程】创建线程的四种方式
上一篇我们初步认识了线程,现在我们来讲一下,创建线程的三种方式 1.继承Thread 类通过继承thread类,然后重写run方法(run方法中是线程真正执行的代码,runable也是如此)即可.当子 ...
- js学习-DOM之动态创建元素的三种方式、插入元素、onkeydown与onkeyup两个事件整理...
动态创建元素的三种方式: 第一种: Document.write(); <body> <input type="button" id="btn" ...
- java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现
工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有Dri ...
- 把对象的创建交给spring来管理—— 1.创建bean的三种方式 2.bean对象的作用范围 3.bean对象的生命周期
把对象的创建交给spring来管理 spring对bean的管理细节 1.创建bean的三种方式 2.bean对象的作用范围 3.bean对象的生命周期 创建Bean的三种方式 ...
- Java并发基础01. 传统线程技术中创建线程的两种方式
传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...
- java并发编程基础系列(五): 创建线程的四种方式
线程的创建一共有四种方式: 继承于Thread类,重写run()方法: 实现Runable接口,实现里面的run()方法: 使用 FutureTask 实现有返回结果的线程 使用ExecutorSer ...
- Spring创建Bean的3种方式
1. Spring创建Bean的三种方式 1. 调用构造器(因为常用就不讲) 2. 调用静态工厂方法 3. 调用实例工厂方法 2. 使用静态工厂方法 1.此时<bean.../>元素要指定 ...
最新文章
- Linux常用的文本查找命令 find
- 用 TS + Vue 写了一个在 Chrome 中运行 Prettier 格式化的扩展程序
- boost::mp11::mp_is_list相关用法的测试程序
- redis lettuce_Redis Client Lettuce 5 GA发布
- Eclipse java中一个工程引用另一个工程的类
- HALCON 21.11:学习笔记---OPC_UA(I/O)
- 固高GTS运动控制卡,C#语言三轴点胶机样本程序源代码
- Foobar音乐播放器——最佳音乐播放器 - imsoft.cnblogs
- canvas系列 — canvas常用API介绍
- 如何解决浏览器未安装FLASH控件的提示
- JavaScript代码模拟鼠标自动点击事件
- 关键词排名查询-各大搜索引擎批量实时关键词排名查询
- 联想小新300加固态_Lenovo 联想 小新310 硬盘移位加装SSD
- Spring 核心 之 AOP
- 哪个学校计算机考研945,2018年郑州大学945软件工程专业基础综合考研复习资料...
- C# dynamic是什么
- 清华大学课题组联合美团研发无人机声波定位技术获ACM SenSys顶会大奖
- 项目一之绘制小王八爬行
- Ant是什么 使用 介绍
- Java —— 内存泄露排查
热门文章
- Google回应全球宕机:磁盘满了;摩拜App昨晚正式停止服务;Docker Desktop 3.0.0发布|极客头条...
- 直播、线上办公、IoT需求井喷,Wi-Fi 6如何防止网络“塞车”?
- GPU 加速数据科学乘风破浪
- 共建智慧云基石,阿里云携手英特尔走向数智未来
- 腾讯与老干妈达成和解;传苹果将停掉 MacBook Air 产品线;VS Code 1.47 发布| 极客头条...
- 公共 API 的错误次数远超你想象!
- 调查了 10,975 位 Go 语言开发者,我们有了这些发现!
- 如何开始第一个开源项目?
- 清华学霸组团的工业 AIoT 创企再获数千万融资:玩家应推动在边缘 AI 芯片上跑算法...
- Python 处理分析 128 张 Excel 表格竟不到3秒?| 附数据集