视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
React中的refs的使用教程
2020-11-27 22:19:27 责编:小采
文档


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在浏览器中运行的效果如下图:

在最上面的输入框中输入任意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节点获取焦点。

下载本文
显示全文
专题