国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

學習React中ref的兩個demo示例

2019-11-19 13:16:12
字體:
來源:轉載
供稿:網友

為了擺脫繁瑣的Dom操作, React提倡組件化, 組件內部用數據來驅動視圖的方式,來實現各種復雜的業務邏輯 ,然而,當我們為原始Dom綁定事件的時候, 還需要通過組件獲取原始的Dom, 而React也提供了ref為我們解決這個問題.

為什么不能從組件直接獲取Dom?

組件并不是真實的 DOM 節點,而是存在于內存之中的一種數據結構,叫做虛擬 DOM (virtual DOM)。只有當它插入文檔以后,才會變成真實的 DOM

如果需要從組件獲取真實 DOM 的節點,就要用到官方提供的ref屬性

使用場景

當用戶加載頁面后, 默認聚焦到input框

import React, { Component } from 'react';import './App.css';// React組件準確捕捉鍵盤事件的democlass 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})  })  // 默認聚焦input輸入框  this.inputRef.current.focus() } render() {  return (   <div className="app">    <input ref={this.inputRef}/>    <p>當前輸入的是: <span>{this.state.showTxt}</span></p>   </div>  ); }}export default App;

自動聚焦input動畫演示

使用場景

為了更好的展示用戶輸入的銀行卡號, 需要每隔四個數字加一個空格

實現思路:

當用戶輸入的字符個數, 可以被5整除時, 額外加一個空格

當用戶刪除數字時,遇到空格, 要移除兩個字符(一個空格, 一個數字),

為了實現以上想法, 必須獲取鍵盤的BackSpace事件, 重寫刪除的邏輯

限制為數字, 隔四位加空格

 

import React, { Component } from 'react';import './App.css';// React組件準確捕捉鍵盤事件的democlass 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);  });  // 默認聚焦input輸入框  this.inputRef.current.focus() } // 處理鍵盤事件 changeShowTxt(event){  // 當輸入刪除鍵時  if (event.key === "Backspace") {   // 如果以空格結尾, 刪除兩個字符   if (this.state.showTxt.endsWith(" ")){    this.setState({showTxt: this.state.showTxt.substring(0, this.state.showTxt.length-2)})   // 正常刪除一個字符   }else{    this.setState({showTxt: this.state.showTxt.substring(0, this.state.showTxt.length-1)})   }  }  // 當輸入數字時  if (["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"].includes(event.key)){   // 如果當前輸入的字符個數取余為0, 則先添加一個空格   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>銀行卡號 隔四位加空格 demo</p>    <input ref={this.inputRef} value={this.state.showTxt}/>   </div>  ); }}export default App;

小結:

虛擬Dom雖然能夠提升網頁的性能, 但虛擬 DOM 是拿不到用戶輸入的。為了獲取文本輸入框的一些操作, 還是js原生的事件綁定機制最好用~

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石屏县| 凯里市| 大埔县| 通辽市| 高台县| 肥乡县| 且末县| 徐闻县| 安多县| 丰都县| 秦安县| 板桥市| 五大连池市| 临江市| 辰溪县| 遂溪县| 光泽县| 中江县| 沈阳市| 岚皋县| 青海省| 会同县| 廊坊市| 锡林郭勒盟| 宁河县| 柳江县| 文化| 永寿县| 抚远县| 凤山县| 桦甸市| 开化县| 莱州市| 兴化市| 芦山县| 荣成市| 长岛县| 若尔盖县| 义马市| 酒泉市| 运城市|