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 建设银行登陆键盘
Jun 10 Javascript
jquery png 透明解决方案(推荐)
Aug 21 Javascript
获取下拉列表框的值是数组,split,$.inArray示例
Nov 13 Javascript
javascript页面加载完执行事件代码
Feb 11 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
Mar 20 Javascript
理解javascript中Map代替循环
Feb 26 Javascript
node.js 和HTML5开发本地桌面应用程序
Dec 13 Javascript
详解jquery选择器的原理
Aug 01 jQuery
让axios发送表单请求形式的键值对post数据的实例
Aug 11 Javascript
jQuery实现本地存储
Dec 22 jQuery
vue+openlayers绘制省市边界线
Dec 24 Vue.js
JavaScript中的宏任务和微任务详情
Nov 27 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
收音机频率指针指示不准确和灵敏度低问题
2021/03/02 无线电
关于更改Zend Studio/Eclipse代码风格主题的介绍
2013/06/23 PHP
PHP中nowdoc和heredoc使用需要注意的一点
2014/03/21 PHP
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
JavaScript中的Math.E属性使用详解
2015/06/12 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
ubuntu编译nodejs所需的软件并安装
2017/09/12 NodeJs
React中的refs的使用教程
2018/02/13 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
使用webpack搭建vue项目实现脚手架功能
2019/03/15 Javascript
Vue项目服务器部署之子目录部署方法
2019/05/12 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
vue 实现图片懒加载功能
2020/12/31 Vue.js
python中bisect模块用法实例
2014/09/25 Python
python爬虫实例详解
2018/06/19 Python
详解Python3的TFTP文件传输
2018/06/26 Python
详解django+django-celery+celery的整合实战
2019/03/19 Python
Python minidom模块用法示例【DOM写入和解析XML】
2019/03/25 Python
Python面向对象封装操作案例详解 II
2020/01/02 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
详解python中的lambda与sorted函数
2020/09/04 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
全球性的在线购物网站:Zapals
2017/03/22 全球购物
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
新加坡网上花店:FlowerAdvisor新加坡
2018/10/05 全球购物
有原因的手表:Flex Watches
2019/03/23 全球购物
活动新闻稿范文
2015/07/17 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python
Python代码实现双链表
2022/05/25 Python
如何利用python实现列表嵌套字典取值
2022/06/10 Python