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 相关文章推荐
URL地址中的#符号使用说明
Feb 12 Javascript
qTip2 精致的基于jQuery提示信息插件
Feb 17 Javascript
js中prototype用法详细介绍
Nov 14 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
Jul 27 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
Jan 13 Javascript
详解JavaScript对象的深浅复制
Mar 30 Javascript
Angular 2父子组件之间共享服务通信的实现
Jul 04 Javascript
Js利用prototype自定义数组方法示例
Oct 20 Javascript
bootstrap table表格插件之服务器端分页实例代码
Sep 12 Javascript
layui插件表单验证提交触发提交的例子
Sep 09 Javascript
基于小程序请求接口wx.request封装的类axios请求
Jul 02 Javascript
浅谈JavaScript中的“!!”作用
Aug 03 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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
PHP中文汉字验证码
2007/04/08 PHP
php实用代码片段整理
2016/11/12 PHP
基于MooTools的很有创意的滚动条时钟动画
2010/11/14 Javascript
javascript 事件处理、鼠标拖动效果实现方法详解
2012/05/11 Javascript
javascript中数组的冒泡排序使用示例
2013/12/18 Javascript
jquery实现的Accordion折叠面板效果代码
2015/09/02 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
实例浅析js的this
2016/12/11 Javascript
jQuery操作css样式
2017/05/15 jQuery
在Vue项目中引入腾讯验证码服务的教程
2018/04/03 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
利用Dectorator分模块存储Vuex状态的实现
2019/02/05 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
2019/04/02 Javascript
JavaScript canvas绘制渐变颜色的矩形
2020/02/18 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
JS变量提升原理与用法实例浅析
2020/05/22 Javascript
使用PDB模式调试Python程序介绍
2015/04/05 Python
Python下使用Psyco模块优化运行速度
2015/04/05 Python
利用Python学习RabbitMQ消息队列
2015/11/30 Python
通过Python模块filecmp 对文件比较的实现方法
2018/06/29 Python
详解Python字典小结
2018/10/20 Python
dataframe 按条件替换某一列中的值方法
2019/01/29 Python
使用tensorflow实现矩阵分解方式
2020/02/07 Python
python求解汉诺塔游戏
2020/07/09 Python
如何使用Python调整图像大小
2020/09/26 Python
用CSS3写的模仿iPhone中的返回按钮
2015/04/04 HTML / CSS
美国便宜的横幅和标志印刷在线:Best of Signs
2019/05/29 全球购物
Servlet如何得到客户端机器的信息
2014/10/17 面试题
电子商务专业学生的自我鉴定
2013/11/28 职场文书
开业庆典答谢词
2014/01/18 职场文书
普罗米修斯教学反思
2014/02/06 职场文书
宣传部部长竞选演讲稿
2014/04/26 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js
Mysql表数据比较大情况下修改添加字段的方法实例
2022/06/28 MySQL