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实现自定义对话框的代码
Jun 15 Javascript
jQuery插件jRumble实现网页元素抖动
Jun 05 Javascript
js中javascript:void(0) 真正含义
Nov 05 Javascript
AngularJS使用ng-repeat指令实现下拉框
Aug 23 Javascript
原生js仿jquery一些常用方法(必看篇)
Sep 20 Javascript
AngularJS实时获取并显示密码的方法
Feb 06 Javascript
TypeScript中的方法重载详解
Apr 12 Javascript
node删除、复制文件或文件夹示例代码
Aug 13 Javascript
vue实现输入框自动跳转功能
May 20 Javascript
微信小程序实现搜索框功能及踩过的坑
Jun 19 Javascript
JavaScript中reduce()的5个基本用法示例
Jul 19 Javascript
详解Typescript里的This的使用方法
Jan 08 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
解析mysql 表中的碎片产生原因以及清理
2013/06/22 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
PHP6新特性分析
2016/03/03 PHP
PHP PDOStatement::setFetchMode讲解
2019/02/03 PHP
Prototype Object对象 学习
2009/07/12 Javascript
js下通过prototype扩展实现indexOf的代码
2010/12/08 Javascript
js触发asp.net的Button的Onclick事件应用
2013/02/02 Javascript
设置checkbox为只读(readOnly)的两种方式
2013/10/11 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
2018/09/01 jQuery
利用chrome浏览器进行js调试并找出元素绑定的点击事件详解
2021/01/30 Javascript
基于nodejs的雪碧图制作工具的示例代码
2018/11/05 NodeJs
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
layui数据表格跨行自动合并的例子
2019/09/02 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
2019/10/24 Javascript
详解vue中$nextTick和$forceUpdate的用法
2019/12/11 Javascript
使用Python处理Excel表格的简单方法
2018/06/07 Python
python Pillow图像处理方法汇总
2019/10/16 Python
python爬虫开发之使用Python爬虫库requests多线程抓取猫眼电影TOP100实例
2020/03/10 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
CSS3 2D模拟实现摩天轮旋转效果
2016/11/16 HTML / CSS
HTML5的自定义属性data-*详细介绍和JS操作实例
2014/04/10 HTML / CSS
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
致1500米运动员广播稿
2014/02/07 职场文书
3的组成教学反思
2014/04/30 职场文书
幼儿园六一儿童节活动方案
2014/08/26 职场文书
交警作风整顿剖析材料
2014/10/11 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL
解决使用了nginx获取IP地址都是127.0.0.1 的问题
2021/09/25 Servers