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 相关文章推荐
js清空表单数据的两种方式(遍历+reset)
Jul 18 Javascript
js判断手机和pc端选择不同执行事件的方法
Jan 30 Javascript
JavaScript中的pow()方法使用详解
Jun 15 Javascript
JS实现选项卡实例详解
Nov 17 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
Dec 04 Javascript
jQuery实现查找链接文字替换属性的方法
Jun 27 Javascript
jQuery获取attr()与prop()属性值的方法及区别介绍
Jul 06 Javascript
AngularJS基础 ng-href 指令用法
Aug 01 Javascript
ionic2 tabs使用 Modal底部tab弹出框
Dec 30 Javascript
JavaScript学习笔记之惰性函数示例详解
Aug 27 Javascript
vue中使用cropperjs的方法
Mar 01 Javascript
Vue实现跑马灯效果
May 25 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
浅谈Windows下 PHP4.0与oracle 8的连接设置
2006/10/09 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
javascript 拖动表格行实现代码
2011/05/05 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
Javascript核心读书有感之语言核心
2015/02/01 Javascript
js实现鼠标经过表格行变色的方法
2015/05/12 Javascript
详解微信小程序 wx.uploadFile 的编码坑
2017/01/23 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
vue项目中实现的微信分享功能示例
2019/01/21 Javascript
JsonProperty 的使用方法详解
2019/10/11 Javascript
详解Vue3中对VDOM的改进
2020/04/23 Javascript
[01:00:54]TI4正赛第二日开场
2014/07/20 DOTA
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
Python编程判断这天是这一年第几天的方法示例
2017/04/18 Python
Python实现在线暴力破解邮箱账号密码功能示例【测试可用】
2017/09/06 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
Django框架首页和登录页分离操作示例
2019/05/28 Python
python dataframe NaN处理方式
2019/12/26 Python
Python3读写Excel文件(使用xlrd,xlsxwriter,openpyxl3种方式读写实例与优劣)
2020/02/13 Python
使用Python获取爱奇艺电视剧弹幕数据的示例代码
2021/01/12 Python
Python 将代码转换为可执行文件脱离python环境运行(步骤详解)
2021/01/25 Python
Marriott中国:万豪国际酒店查询预订
2016/09/02 全球购物
大学生毕业自我评价范文分享
2013/11/07 职场文书
培训自我鉴定
2014/01/31 职场文书
学校开学标语
2014/10/06 职场文书
离职报告格式
2014/11/04 职场文书
党员心得体会范文2016
2016/01/23 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python
分析Python list操作为什么会错误
2021/11/17 Python
html粘性页脚的具体使用
2022/01/18 HTML / CSS
MySQL 逻辑备份 into outfile
2022/05/15 MySQL