<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識(shí)百科 - 正文

        學(xué)習(xí)React中ref的兩個(gè)demo示例

        來源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 22:10:03
        文檔

        學(xué)習(xí)React中ref的兩個(gè)demo示例

        學(xué)習(xí)React中ref的兩個(gè)demo示例:為了擺脫繁瑣的Dom操作, React提倡組件化, 組件內(nèi)部用數(shù)據(jù)來驅(qū)動(dòng)視圖的方式,來實(shí)現(xiàn)各種復(fù)雜的業(yè)務(wù)邏輯 ,然而,當(dāng)我們?yōu)樵糄om綁定事件的時(shí)候, 還需要通過組件獲取原始的Dom, 而React也提供了ref為我們解決這個(gè)問題. 為什么不能從組件直接獲取Dom?
        推薦度:
        導(dǎo)讀學(xué)習(xí)React中ref的兩個(gè)demo示例:為了擺脫繁瑣的Dom操作, React提倡組件化, 組件內(nèi)部用數(shù)據(jù)來驅(qū)動(dòng)視圖的方式,來實(shí)現(xiàn)各種復(fù)雜的業(yè)務(wù)邏輯 ,然而,當(dāng)我們?yōu)樵糄om綁定事件的時(shí)候, 還需要通過組件獲取原始的Dom, 而React也提供了ref為我們解決這個(gè)問題. 為什么不能從組件直接獲取Dom?

        為了擺脫繁瑣的Dom操作, React提倡組件化, 組件內(nèi)部用數(shù)據(jù)來驅(qū)動(dòng)視圖的方式,來實(shí)現(xiàn)各種復(fù)雜的業(yè)務(wù)邏輯 ,然而,當(dāng)我們?yōu)樵糄om綁定事件的時(shí)候, 還需要通過組件獲取原始的Dom, 而React也提供了ref為我們解決這個(gè)問題.

        為什么不能從組件直接獲取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)用戶加載頁面后, 默認(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)畫演示

        使用場(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事件, 重寫刪除的邏輯

        限制為數(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)頁的性能, 但虛擬 DOM 是拿不到用戶輸入的。為了獲取文本輸入框的一些操作, 還是js原生的事件綁定機(jī)制最好用~

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        學(xué)習(xí)React中ref的兩個(gè)demo示例

        學(xué)習(xí)React中ref的兩個(gè)demo示例:為了擺脫繁瑣的Dom操作, React提倡組件化, 組件內(nèi)部用數(shù)據(jù)來驅(qū)動(dòng)視圖的方式,來實(shí)現(xiàn)各種復(fù)雜的業(yè)務(wù)邏輯 ,然而,當(dāng)我們?yōu)樵糄om綁定事件的時(shí)候, 還需要通過組件獲取原始的Dom, 而React也提供了ref為我們解決這個(gè)問題. 為什么不能從組件直接獲取Dom?
        推薦度:
        標(biāo)簽: 實(shí)例 demo ref
        • 熱門焦點(diǎn)

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 又爽又高潮的BB视频免费看| **真实毛片免费观看| 国产精品免费播放| 亚洲乱色伦图片区小说| 免费无码黄十八禁网站在线观看 | 精品97国产免费人成视频 | 无码国模国产在线观看免费| 亚洲日韩AV一区二区三区四区| 免费观看一级毛片| 亚洲国产aⅴ成人精品无吗| 四虎成人免费网站在线| 亚洲大尺度无码无码专线一区| 成年女人免费视频播放体验区| 亚洲AV无码AV吞精久久| 国产免费久久精品久久久| kk4kk免费视频毛片| 国产成人精品日本亚洲| 久久精品国产免费观看| 亚洲中文无码亚洲人成影院| 国产精品另类激情久久久免费| 色费女人18女人毛片免费视频| 中文字幕亚洲激情| 日本在线看片免费人成视频1000 | 四虎成人免费影院网址| 特级aaaaaaaaa毛片免费视频| 亚洲色自偷自拍另类小说| 午夜视频免费在线观看| 亚洲影视自拍揄拍愉拍| 免费一级做a爰片久久毛片潮喷| 国产免费人成视频在线播放播| 91嫩草私人成人亚洲影院| 成人黄动漫画免费网站视频| 美女被暴羞羞免费视频| 亚洲成在人线av| 午夜视频在线观看免费完整版| 精品国产污污免费网站入口| 亚洲精品自在线拍| 亚洲日本在线观看视频| 无码国产精品久久一区免费| caoporm超免费公开视频| 亚洲福利视频一区二区三区|