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 import css实例代码
Jul 18 Javascript
ajax中get和post的说明及使用与区别
Dec 23 Javascript
获取表单控件原始(初始)值的方法
Aug 21 Javascript
js获取页面传来参数的方法
Sep 06 Javascript
jquery小火箭返回顶部代码分享
Aug 19 Javascript
Bootstrap每天必学之媒体对象
Nov 30 Javascript
JavaScript实现的商品抢购倒计时功能示例
Apr 17 Javascript
基于pako.js实现gzip的压缩和解压功能示例
Jun 13 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
Aug 16 Javascript
swiper在vue项目中loop循环轮播失效的解决方法
Sep 15 Javascript
Vue 实现前进刷新后退不刷新的效果
Jun 14 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
Dec 04 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实现框架(一)
2006/10/09 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
LotusPhp笔记之:Logger组件的使用方法
2013/05/06 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
PHP表单数据写入MySQL数据库的代码
2016/05/31 PHP
ubutu 16.04环境下,PHP与mysql数据库,网页登录验证实例讲解
2017/07/20 PHP
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
EasySlider 基于jQuery功能强大简单易用的滑动门插件
2010/06/11 Javascript
浅谈javascript的数据类型检测
2010/07/10 Javascript
jquery 日期控件datepicker属性详细解析
2013/11/08 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
2013/11/20 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
AngularJs 60分钟入门基础教程
2016/04/03 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
js截取字符串功能的实现方法
2017/09/27 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
jQuery与vue实现拖动验证码功能
2018/01/30 jQuery
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
JavaScript实现与使用发布/订阅模式详解
2019/01/19 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
Python实现屏幕截图的两种方式
2018/02/05 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
python+pandas+时间、日期以及时间序列处理方法
2018/07/10 Python
利用Python将文本中的中英文分离方法
2018/10/31 Python
python适合人工智能的理由和优势
2019/06/28 Python
AMAVII眼镜官网:时尚和设计师太阳镜
2019/05/05 全球购物
考博导师推荐信范文
2015/03/27 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
用python基于appium模块开发一个自动收取能量的小助手
2021/09/25 Python
python manim实现排序算法动画示例
2022/08/14 Python