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 的几种方式相关推荐

  1. java多线程w3c_Java创建多线程的三种方式

    前言 这篇文章主要讲述线程的概念.组成.Java创建多线程的三种方式以及线程的类型. 线程概念 线程和进程的区别 **进程:**正在运行的程序,例如:你打开 的qq音乐.exe程序,其由PCB(进程控 ...

  2. Spring注解创建Bean的几种方式

    Spring注解创建Bean的几种方式 1.@Component系列 @Component @Service @Repository @Controller @Configuration 2. 依附于 ...

  3. 【并发编程】创建线程的四种方式

    上一篇我们初步认识了线程,现在我们来讲一下,创建线程的三种方式 1.继承Thread 类通过继承thread类,然后重写run方法(run方法中是线程真正执行的代码,runable也是如此)即可.当子 ...

  4. js学习-DOM之动态创建元素的三种方式、插入元素、onkeydown与onkeyup两个事件整理...

    动态创建元素的三种方式: 第一种: Document.write(); <body> <input type="button" id="btn" ...

  5. java bean 工厂模式_Spring框架通过工厂创建Bean的三种方式实现

    工厂模式 Spring中bean的创建,默认是框架利用反射new出来的bean实例.有时候也会有一些复杂的情况. 假设有一个飞机,属性如下,现在需要造很多同型号的飞机,那么唯一需要改变的属性只有Dri ...

  6. 把对象的创建交给spring来管理——  1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期

    把对象的创建交给spring来管理 spring对bean的管理细节     1.创建bean的三种方式     2.bean对象的作用范围     3.bean对象的生命周期 创建Bean的三种方式 ...

  7. Java并发基础01. 传统线程技术中创建线程的两种方式

    传统的线程技术中有两种创建线程的方式:一是继承Thread类,并重写run()方法:二是实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread.这两种方式 ...

  8. java并发编程基础系列(五): 创建线程的四种方式

    线程的创建一共有四种方式: 继承于Thread类,重写run()方法: 实现Runable接口,实现里面的run()方法: 使用 FutureTask 实现有返回结果的线程 使用ExecutorSer ...

  9. Spring创建Bean的3种方式

    1. Spring创建Bean的三种方式 1. 调用构造器(因为常用就不讲) 2. 调用静态工厂方法 3. 调用实例工厂方法 2. 使用静态工厂方法 1.此时<bean.../>元素要指定 ...

最新文章

  1. Linux常用的文本查找命令 find
  2. 用 TS + Vue 写了一个在 Chrome 中运行 Prettier 格式化的扩展程序
  3. boost::mp11::mp_is_list相关用法的测试程序
  4. redis lettuce_Redis Client Lettuce 5 GA发布
  5. Eclipse java中一个工程引用另一个工程的类
  6. HALCON 21.11:学习笔记---OPC_UA(I/O)
  7. 固高GTS运动控制卡,C#语言三轴点胶机样本程序源代码
  8. Foobar音乐播放器——最佳音乐播放器 - imsoft.cnblogs
  9. canvas系列 — canvas常用API介绍
  10. 如何解决浏览器未安装FLASH控件的提示
  11. JavaScript代码模拟鼠标自动点击事件
  12. 关键词排名查询-各大搜索引擎批量实时关键词排名查询
  13. 联想小新300加固态_Lenovo 联想 小新310 硬盘移位加装SSD
  14. Spring 核心 之 AOP
  15. 哪个学校计算机考研945,2018年郑州大学945软件工程专业基础综合考研复习资料...
  16. C# dynamic是什么
  17. 清华大学课题组联合美团研发无人机声波定位技术获ACM SenSys顶会大奖
  18. 项目一之绘制小王八爬行
  19. Ant是什么 使用 介绍
  20. Java —— 内存泄露排查

热门文章

  1. Google回应全球宕机:磁盘满了;摩拜App昨晚正式停止服务;Docker Desktop 3.0.0发布|极客头条...
  2. 直播、线上办公、IoT需求井喷,Wi-Fi 6如何防止网络“塞车”?
  3. GPU 加速数据科学乘风破浪
  4. 共建智慧云基石,阿里云携手英特尔走向数智未来
  5. 腾讯与老干妈达成和解;传苹果将停掉 MacBook Air 产品线;VS Code 1.47 发布| 极客头条...
  6. 公共 API 的错误次数远超你想象!
  7. 调查了 10,975 位 Go 语言开发者,我们有了这些发现!
  8. 如何开始第一个开源项目?
  9. 清华学霸组团的工业 AIoT 创企再获数千万融资:玩家应推动在边缘 AI 芯片上跑算法...
  10. Python 处理分析 128 张 Excel 表格竟不到3秒?| 附数据集