React中的refs的使用教程


Posted in Javascript onFebruary 13, 2018

ref是React中的一种属性,当render函数返回某个组件的实例时,可以给render中的某个虚拟DOM节点添加一个ref属性,如下面的代码所示:

<body> 
  <script type="text/jsx"> 
    var App = React.createClass({ 
      render: function() { 
        return ( 
          <div> 
            <input type="text" placeholder="input something..." ref="input" /> 
          </div> 
        ); 
      } 
    }); 
    React.render( 
      <App />, 
      document.body 
    ); 
  </script> 
</body>

在上面的代码中,render函数里仅仅返回了一个<div>标签,<div>里仅有一个<input>标签,在<input>标签的属性中,添加了一个ref属性,官方文档上对于ref属性的解释如下:

ref 属性

React 支持一种非常特殊的属性,你可以用来绑定到 render() 输出的任何组件上去。这个特殊的属性允许你引用 render() 返回的相应的支撑实例( backing instance )。这样就可以确保在任何时间总是拿到正确的实例。

给<input>标签设置ref属性有什么用途呢?下面是官方文档给出的解释:

在其它代码中(典型地事件处理代码),通过 this.refs 获取支撑实例( backing instance ),就像这样:this.refs.input。其中"input"就是上面给<input>标签设置的ref属性的值。

通过ref属性,我们还可以拿到该虚拟DOM对应的真实DOM节点,有两种方法可以拿到真实DOM节点,如下代码所示:

<input type="text" ref="username" /> 
//下面4种方式都可以通过ref获取真实DOM节点 
var usernameDOM = this.refs.username.getDOMNode(); 
var usernameDOM = React.findDOMNode(this.refs.username); 
var usernameDOM = this.refs['username'].getDOMNode(); 
var usernameDOM = React.findDOMNode(this.refs['username']);

下面通过一个demo来了解ref的使用:

demo在浏览器中运行的效果如下图:

React中的refs的使用教程

在最上面的输入框中输入任意1-10的数字,即可让下面10个输入框中对应的输入框获取焦点,如上图,输入3后,下面第3个输入框马上获取焦点,这里就用到了ref属性,代码如下:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
  <meta charset="UTF-8"> 
  <title>Refs</title> 
  <script type="text/javascript" src="../react-0.13.0/build/react.js"></script> 
  <script type="text/javascript" src="../react-0.13.0/build/JSXTransformer.js"></script> 
</head> 
<body> 
  <script type="text/jsx"> 
    var App = React.createClass({ 
      handleChange: function(event) { 
        var index = event.target.value; 
        if(index >= 1 && index <= 10) { 
          //找到对应的输入框并将焦点设置到里面 
          var refName = "input" + index; 
          //var inputDOM = React.findDOMNode(this.refs[refName]); 
          var inputDOM = this.refs[refName].getDOMNode(); 
          inputDOM.focus(); 
        } 
      }, 
      render: function() { 
        var inputs = []; 
        for(var i = 1; i <= 10; i++) { 
          inputs.push(<div><li><input type="text" ref={"input" + i}/></li><br/></div>); 
        } 
        return ( 
          <div> 
            <label htmlFor="input" >在这里输入下面任意输入框的索引,光标会自动定位到输入框内:</label> 
            <input type="text" id="input" onChange={this.handleChange} /> 
            <hr /> 
            <ol> 
              {inputs} 
            </ol> 
          </div> 
        ) 
      } 
    }); 
    React.render( 
      <App />, 
      document.body 
    ); 
  </script> 
</body> 
</html>

在render函数中,为html文档的body部分添加了10个输入框,每个输入框的ref属性都设置成了["index" + 索引]的这种方式,然后在最上面的输入框的handleChange函数中,获取输入的数字,并得到ref属性的值,最后根据ref属性的值,找到对应的真实DOM节点,然后让该DOM节点获取焦点。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
extjs 学习笔记(一) 一些基础知识
Oct 13 Javascript
jQuery Tips 为AJAX回调函数传递额外参数的方法
Dec 28 Javascript
js中eval详解
Mar 30 Javascript
使用JQuery快速实现Tab的AJAX动态载入(实例讲解)
Dec 11 Javascript
js进行表单验证实例分析
Feb 10 Javascript
归纳下js面向对象的几种常见写法总结
Aug 24 Javascript
JavaScript 栈的详解及实例代码
Jan 22 Javascript
vue组件(全局,局部,动态加载组件)
Sep 02 Javascript
webpack优化的深入理解
Dec 10 Javascript
react中使用css的7中方式(最全总结)
Feb 11 Javascript
在vue-cli中引入lodash.js并使用详解
Nov 13 Javascript
js实现百度淘宝搜索功能
Feb 17 Javascript
tween.js缓动补间动画算法示例
Feb 13 #Javascript
基于Node.js实现压缩和解压缩的方法
Feb 13 #Javascript
Vue打包后出现一些map文件的解决方法
Feb 13 #Javascript
nginx部署访问vue-cli搭建的项目的方法
Feb 12 #Javascript
vue2.0实现前端星星评分功能组件实例代码
Feb 12 #Javascript
nginx+vue.js实现前后端分离的示例代码
Feb 12 #Javascript
Vue+webpack项目基础配置教程
Feb 12 #Javascript
You might like
全国中波电台频率表
2020/03/11 无线电
通俗易懂的php防注入代码
2010/04/07 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
ionic js 模型 $ionicModal 可以遮住用户主界面的内容框
2016/06/06 Javascript
javascript函数的四种调用模式
2017/01/08 Javascript
js 输入框 正则表达式(菜鸟必看教程)
2017/02/19 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
基于Bootstrap实现城市三级联动
2017/11/23 Javascript
json字符串对象转换代码实例
2019/09/28 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
[57:50]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第二局
2016/03/05 DOTA
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
Python实现的HTTP并发测试完整示例
2020/04/23 Python
python实现用于测试网站访问速率的方法
2015/05/26 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
python实战串口助手_解决8串口多个发送的问题
2019/06/12 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
django中使用事务及接入支付宝支付功能
2019/09/15 Python
Python TCPServer 多线程多客户端通信的实现
2019/12/31 Python
在Matplotlib图中插入LaTex公式实例
2020/04/17 Python
Python 多线程C段扫描、检测 Ping扫描脚本的实现
2020/09/03 Python
pandas按条件筛选数据的实现
2021/02/20 Python
CSS3教程:新增加的结构伪类
2009/04/02 HTML / CSS
css3实现超炫风车特效
2014/11/12 HTML / CSS
《美丽的彩虹》教学反思
2014/02/25 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
暑假安全保证书
2015/02/28 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
js中Object.create实例用法详解
2021/10/05 Javascript
手写实现JS中的new
2021/11/07 Javascript