React中的refs的使用教程
ref是React中的一種屬性,當(dāng)render函數(shù)返回某個(gè)組件的實(shí)例時(shí),可以給render中的某個(gè)虛擬DOM節(jié)點(diǎn)添加一個(gè)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函數(shù)里僅僅返回了一個(gè)<div>標(biāo)簽,<div>里僅有一個(gè)<input>標(biāo)簽,在<input>標(biāo)簽的屬性中,添加了一個(gè)ref屬性,官方文檔上對(duì)于ref屬性的解釋如下:
ref 屬性
React 支持一種非常特殊的屬性,你可以用來綁定到 render() 輸出的任何組件上去。這個(gè)特殊的屬性允許你引用 render() 返回的相應(yīng)的支撐實(shí)例( backing instance )。這樣就可以確保在任何時(shí)間總是拿到正確的實(shí)例。
給<input>標(biāo)簽設(shè)置ref屬性有什么用途呢?下面是官方文檔給出的解釋:
在其它代碼中(典型地事件處理代碼),通過 this.refs 獲取支撐實(shí)例( backing instance ),就像這樣:this.refs.input。其中"input"就是上面給<input>標(biāo)簽設(shè)置的ref屬性的值。
通過ref屬性,我們還可以拿到該虛擬DOM對(duì)應(yīng)的真實(shí)DOM節(jié)點(diǎn),有兩種方法可以拿到真實(shí)DOM節(jié)點(diǎn),如下代碼所示:
<input type="text" ref="username" /> //下面4種方式都可以通過ref獲取真實(shí)DOM節(jié)點(diǎn) 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']);
下面通過一個(gè)demo來了解ref的使用:
demo在瀏覽器中運(yùn)行的效果如下圖:

在最上面的輸入框中輸入任意1-10的數(shù)字,即可讓下面10個(gè)輸入框中對(duì)應(yīng)的輸入框獲取焦點(diǎn),如上圖,輸入3后,下面第3個(gè)輸入框馬上獲取焦點(diǎn),這里就用到了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) {
//找到對(duì)應(yīng)的輸入框并將焦點(diǎn)設(shè)置到里面
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" >在這里輸入下面任意輸入框的索引,光標(biāo)會(huì)自動(dòng)定位到輸入框內(nèi):</label>
<input type="text" id="input" onChange={this.handleChange} />
<hr />
<ol>
{inputs}
</ol>
</div>
)
}
});
React.render(
<App />,
document.body
);
</script>
</body>
</html>
在render函數(shù)中,為html文檔的body部分添加了10個(gè)輸入框,每個(gè)輸入框的ref屬性都設(shè)置成了["index" + 索引]的這種方式,然后在最上面的輸入框的handleChange函數(shù)中,獲取輸入的數(shù)字,并得到ref屬性的值,最后根據(jù)ref屬性的值,找到對(duì)應(yīng)的真實(shí)DOM節(jié)點(diǎn),然后讓該DOM節(jié)點(diǎn)獲取焦點(diǎn)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
React實(shí)現(xiàn)一個(gè)通用骨架屏組件示例
骨架屏就是在頁(yè)面數(shù)據(jù)尚未加載前先給用戶展示出頁(yè)面的大致結(jié)構(gòu),直到請(qǐng)求數(shù)據(jù)返回后再渲染頁(yè)面,補(bǔ)充進(jìn)需要顯示的數(shù)據(jù)內(nèi)容,本文就介紹了React實(shí)現(xiàn)一個(gè)通用骨架屏組件示例,分享給大家,感興趣的可以了解一下2021-12-12
在Create React App中使用CSS Modules的方法示例
本文介紹了如何在 Create React App 腳手架中使用 CSS Modules 的兩種方式。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)你有所幫助。2019-01-01
React通過ref獲取子組件的數(shù)據(jù)和方法
這篇文章主要介紹了React如何通過ref獲取子組件的數(shù)據(jù)和方法,文中有詳細(xì)的總結(jié)內(nèi)容和代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下2023-10-10
React如何使用axios請(qǐng)求數(shù)據(jù)并把數(shù)據(jù)渲染到組件
這篇文章主要介紹了React如何使用axios請(qǐng)求數(shù)據(jù)并把數(shù)據(jù)渲染到組件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08
React新擴(kuò)展函數(shù)setState與lazyLoad及hook介紹
這篇文章主要介紹了React新擴(kuò)展函數(shù)setState與lazyLoad及hook,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12

