學(xué)習(xí)React中ref的兩個(gè)demo示例
為了擺脫繁瑣的Dom操作, React提倡組件化, 組件內(nèi)部用數(shù)據(jù)來(lái)驅(qū)動(dòng)視圖的方式,來(lái)實(shí)現(xiàn)各種復(fù)雜的業(yè)務(wù)邏輯 ,然而,當(dāng)我們?yōu)樵糄om綁定事件的時(shí)候, 還需要通過(guò)組件獲取原始的Dom, 而React也提供了ref為我們解決這個(gè)問(wèn)題.
為什么不能從組件直接獲取Dom?
組件并不是真實(shí)的 DOM 節(jié)點(diǎn),而是存在于內(nèi)存之中的一種數(shù)據(jù)結(jié)構(gòu),叫做虛擬 DOM (virtual DOM)。只有當(dāng)它插入文檔以后,才會(huì)變成真實(shí)的 DOM
如果需要從組件獲取真實(shí) DOM 的節(jié)點(diǎn),就要用到官方提供的ref屬性
使用場(chǎng)景
當(dāng)用戶加載頁(yè)面后, 默認(rèn)聚焦到input框
import React, { Component } from 'react';
import './App.css';
// React組件準(zhǔn)確捕捉鍵盤事件的demo
class App extends Component {
constructor(props) {
super(props)
this.state = {
showTxt: ""
}
this.inputRef = React.createRef();
}
// 為input綁定事件
componentDidMount(){
this.inputRef.current.addEventListener("keydown", (event)=>{
this.setState({showTxt: event.key})
})
// 默認(rèn)聚焦input輸入框
this.inputRef.current.focus()
}
render() {
return (
<div className="app">
<input ref={this.inputRef}/>
<p>當(dāng)前輸入的是: <span>{this.state.showTxt}</span></p>
</div>
);
}
}
export default App;
自動(dòng)聚焦input動(dòng)畫(huà)演示

使用場(chǎng)景
為了更好的展示用戶輸入的銀行卡號(hào), 需要每隔四個(gè)數(shù)字加一個(gè)空格
實(shí)現(xiàn)思路:
當(dāng)用戶輸入的字符個(gè)數(shù), 可以被5整除時(shí), 額外加一個(gè)空格
當(dāng)用戶刪除數(shù)字時(shí),遇到空格, 要移除兩個(gè)字符(一個(gè)空格, 一個(gè)數(shù)字),
為了實(shí)現(xiàn)以上想法, 必須獲取鍵盤的BackSpace事件, 重寫(xiě)刪除的邏輯
限制為數(shù)字, 隔四位加空格
import React, { Component } from 'react';
import './App.css';
// React組件準(zhǔn)確捕捉鍵盤事件的demo
class App extends Component {
constructor(props) {
super(props)
this.state = {
showTxt: ""
}
this.inputRef = React.createRef();
this.changeShowTxt = this.changeShowTxt.bind(this);
}
// 為input綁定事件
componentDidMount(){
this.inputRef.current.addEventListener("keydown", (event)=>{
this.changeShowTxt(event);
});
// 默認(rèn)聚焦input輸入框
this.inputRef.current.focus()
}
// 處理鍵盤事件
changeShowTxt(event){
// 當(dāng)輸入刪除鍵時(shí)
if (event.key === "Backspace") {
// 如果以空格結(jié)尾, 刪除兩個(gè)字符
if (this.state.showTxt.endsWith(" ")){
this.setState({showTxt: this.state.showTxt.substring(0, this.state.showTxt.length-2)})
// 正常刪除一個(gè)字符
}else{
this.setState({showTxt: this.state.showTxt.substring(0, this.state.showTxt.length-1)})
}
}
// 當(dāng)輸入數(shù)字時(shí)
if (["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"].includes(event.key)){
// 如果當(dāng)前輸入的字符個(gè)數(shù)取余為0, 則先添加一個(gè)空格
if((this.state.showTxt.length+1)%5 === 0){
this.setState({showTxt: this.state.showTxt+' '})
}
this.setState({showTxt: this.state.showTxt+event.key})
}
}
render() {
return (
<div className="app">
<p>銀行卡號(hào) 隔四位加空格 demo</p>
<input ref={this.inputRef} value={this.state.showTxt}/>
</div>
);
}
}
export default App;
小結(jié):
虛擬Dom雖然能夠提升網(wǎng)頁(yè)的性能, 但虛擬 DOM 是拿不到用戶輸入的。為了獲取文本輸入框的一些操作, 還是js原生的事件綁定機(jī)制最好用~
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
react+axios實(shí)現(xiàn)github搜索用戶功能(示例代碼)
這篇文章主要介紹了react+axios實(shí)現(xiàn)搜索github用戶功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
React自定義hooks同步獲取useState的最新?tīng)顟B(tài)值方式
這篇文章主要介紹了React自定義hooks同步獲取useState的最新?tīng)顟B(tài)值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03
詳解react中useCallback內(nèi)部是如何實(shí)現(xiàn)的
前幾天有人在問(wèn)在useCallback函數(shù)如果第二個(gè)參數(shù)為空數(shù)組, 為什么拿不到最新的state值,那么這一章就來(lái)分析一下useCallback內(nèi)部是如何實(shí)現(xiàn)的,感興趣的小伙伴跟著小編一起來(lái)學(xué)習(xí)吧2023-07-07
詳解基于React.js和Node.js的SSR實(shí)現(xiàn)方案
這篇文章主要介紹了詳解基于React.js和Node.js的SSR實(shí)現(xiàn)方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
React?中使用?Redux?的?4?種寫(xiě)法小結(jié)
這篇文章主要介紹了在?React?中使用?Redux?的?4?種寫(xiě)法,Redux 一般來(lái)說(shuō)并不是必須的,只有在項(xiàng)目比較復(fù)雜的時(shí)候,比如多個(gè)分散在不同地方的組件使用同一個(gè)狀態(tài),本文就React使用?Redux的相關(guān)知識(shí)給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-06-06
React項(xiàng)目中動(dòng)態(tài)插入HTML內(nèi)容的實(shí)現(xiàn)
本文主要介紹了React項(xiàng)目中動(dòng)態(tài)插入HTML內(nèi)容的實(shí)現(xiàn),通過(guò)使用React的dangerouslySetInnerHTML屬性,我們可以將HTML內(nèi)容插入到組件中,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10
React Native全面屏狀態(tài)欄和底部導(dǎo)航欄適配教程詳細(xì)講解
最近在寫(xiě) React Native 項(xiàng)目,調(diào)試應(yīng)用時(shí)發(fā)現(xiàn)頂部狀態(tài)欄和底部全面屏手勢(shì)指示條區(qū)域不是透明的,看起來(lái)很難受。研究了一下這個(gè)問(wèn)題,現(xiàn)在總結(jié)一下解決方案,這篇文章主要介紹了React Native全面屏狀態(tài)欄和底部導(dǎo)航欄適配教程2023-01-01

