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 相关文章推荐
几行代码轻松搞定jquery实现flash8类似的连接效果
May 03 Javascript
Google韩国首页图标动画效果
Aug 26 Javascript
jquery.lazyload  实现图片延迟加载jquery插件
Feb 06 Javascript
jQuery UI Autocomplete 体验分享
Feb 14 Javascript
javascript从右边截取指定字符串的三种实现方法
Nov 29 Javascript
理解javascript回调函数
Dec 28 Javascript
Javascript复制实例详解
Jan 28 Javascript
JavaScript实现的XML与JSON互转功能详解
Feb 16 Javascript
利用JS实现简单的瀑布流加载图片效果
Apr 22 Javascript
使用vue构建一个上传图片表单
Jul 04 Javascript
在vue中实现给每个页面顶部设置title
Jul 29 Javascript
分享8个JavaScript库可更好地处理本地存储
Oct 12 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编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
php引用计数器进行垃圾收集机制介绍
2012/09/19 PHP
PHP中spl_autoload_register函数的用法总结
2013/11/07 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
简单介绍PHP的责任链编程模式
2015/08/11 PHP
php微信高级接口群发 多客服
2016/06/23 PHP
修改Laravel自带的认证系统的User类的命名空间的步骤
2019/10/15 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
JS弹出层单纯的绝对定位居中示例代码
2014/02/18 Javascript
网页右下角弹出窗体实现代码
2014/06/05 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
2015/11/18 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
AngularJS入门教程中SQL实例详解
2016/07/27 Javascript
Javascript中函数名.length属性用法分析(对比arguments.length)
2016/09/16 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
jQuery自定义多选下拉框效果
2017/06/19 jQuery
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
2019/03/07 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
2020/11/11 Javascript
web.py获取上传文件名的正确方法
2014/08/26 Python
Python做简单的字符串匹配详解
2017/03/21 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
Python使用Matlab命令过程解析
2020/06/04 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
异步传递消息系统的作用
2016/05/01 面试题
世界气象日活动总结
2015/02/27 职场文书
2015年房地产销售工作总结
2015/04/20 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
Vue全局事件总线你了解吗
2022/02/24 Vue.js