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 相关文章推荐
javascript 二维数组的实现与应用
Mar 16 Javascript
JavaScript定义类或函数的几种方式小结
Jan 09 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
Jun 09 Javascript
JavaScript中的Truthy和Falsy介绍
Jan 01 Javascript
javascript截取字符串小结
Apr 28 Javascript
jquery实现手风琴效果
Nov 20 Javascript
JavaScript实现输入框与清空按钮联动效果
Sep 09 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
Dec 19 Javascript
H5实现仿flash效果的实现代码
Sep 29 Javascript
使用nvm管理不同版本的node与npm的方法
Oct 31 Javascript
Vue 技巧之控制父类的 slot
Feb 24 Javascript
Node.js API详解之 querystring用法实例分析
Apr 29 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
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
2015/02/07 PHP
浅谈php自定义错误日志
2015/02/13 PHP
laravel容器延迟加载以及auth扩展详解
2015/03/02 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
php 实现进制相互转换
2016/04/07 PHP
php实现等比例压缩图片
2018/07/26 PHP
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
使用HTML+CSS+JS制作简单的网页菜单界面
2015/07/27 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python实现二分查找算法实例
2015/05/26 Python
Python对象转JSON字符串的方法
2016/04/27 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
浅谈pc和移动端的响应式的使用
2019/01/03 HTML / CSS
Nike西班牙官方网站:Nike.com (ES)
2017/10/30 全球购物
美国受信赖的教育产品供应商:Nest Learning
2018/06/14 全球购物
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
PatPat德国:妈妈的每日优惠
2019/10/02 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
Oracle里面常用的数据字典有哪些
2014/02/14 面试题
鞋类设计与工艺专业销售求职信
2013/11/01 职场文书
电大本科自我鉴定
2014/02/05 职场文书
大学生见习期满自我鉴定
2014/09/13 职场文书
pytorch实现ResNet结构的实例代码
2021/05/17 Python
Ubuntu18.04下QT开发Android无法连接设备问题解决实现
2022/06/01 Java/Android
Python创建SQL数据库流程逐步讲解
2022/09/23 Python
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS