亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

React事件處理的機制及原理

2024-05-06 16:47:00
字體:
來源:轉載
供稿:網友

React中的事件處理

在React元素中綁定事件有兩點需要注意:

(1)在React中,事件命名采用駝峰命名方式,而不是DOM元素中的小寫字母命名方式。例如onclick要寫成onClick,onchange要寫成onChange等。
(2)處理事件的響應函數要以對象的形式賦值給事件屬性,而不是DOM中的字符串形式。例如在DOM中綁定一個點擊事件應該寫成:

<button onclick="clickButton()">  Click</button>

而在React元素中綁定一個點擊事件變成這種形式:

<button onClick={clickButton}> // clickButton是一個函數  Click</button>

React中的事件是合成事件,并不是原生的DOM事件。

React根據W3C規范定義了一套兼容各個瀏覽器的事件對象。在DOM中可以通過返回false來阻止事件的默認行為,但在React中,必須顯式的調用事件對象的preventDefault方法來阻止事件的默認行為。

在某些場景下如果必須使用DOM提供的原生事件,可以通過React事件對象的nativeEvent屬性獲取。

其實,在平時的開發中,React組件中處理事件最容易出錯的地方是事件處理函數中的this的指向問題,因為ES6 class并不會為方法自動綁定this到當前對象。

下面我們具體來看一下常見的三種處理this的方式:

React事件處理的this處理

使用箭頭函數

直接在React元素中采用箭頭函數定義事件的處理函數,如:

class MyComponent extends React.Component {  constructor(props) {    super(props);    this.state = {      number: 0    }  }  render() {    return (      <button onClick={(event) => {          console.log(this.state.number);        }}>        Click      </button>      )  }}

箭頭函數中的this指向的是函數定義時的對象,所以可以保證this總是指向當前組件的實例對象。

當事件處理邏輯比較復雜時,如果把所有的邏輯直接寫在onClick的大括號中,就會導致render函數變的臃腫,不容易直觀地看出組件的UI結構,代碼可讀性也不好。這樣,我們可以把邏輯處理封裝成組件的一個方法,然后在箭頭函數中調用該方法即可。

class MyComponent extends React.Component {  constructor(props) {    super(props);    this.state = {      number: 0    }  }  handleClick(event) {    const number = ++this.state.number;    this.setState({      number: number    });  }  render() {    return (      <button onClick={(event) => {          this.handleClick(event);        }}>        Click      </button>      )  }}

直接在render方法中為元素事件定義事件處理函數,最大的問題是,每次render調用時,都會重新創建一個新的事件處理函數,帶來額外的性能開銷,組件所處層級越低,這種開銷就越大。當然,大多數情況下,這種開銷是可以接受的。

使用組件方法

直接將組件的方法賦值給元素的事件屬性,同時在類的構造函數中,將這個方法的this綁定到當前對象。如:

class MyComponent extends React.Component {  constructor(props) {    super(props);    this.state = {      number: 0    };    this.handleClick = this.handleClick.bind(this);  }  handleClick(event) {    const number = ++this.state.number;    this.setState({      number: number    });  }  render() {    return (      <button onClick={this.handleClick}>        Click      </button>      )  }}

這種方法的好處是每次render不會重新創建一個回調函數,沒有額外的性能損失。但在構造函數中,為事件處理函數綁定this,尤其是存在多個事件處理函數需要綁定時,這種模板式的代碼還是會顯得繁瑣。

有時候我們還會為元素的事件屬性賦值時,同時為事件處理函數綁定this,例如:

class MyComponent extends React.Component {    ……  render() {    return (      /* 事件屬性賦值和this綁定同時 */      <button onClick={this.handleClick.bind(this)}>        Click      </button>      )  }}

使用bind會創建一個新的函數,因此這種寫法依然存在每次render都會創建一個新函數的問題。但是在需要為函數傳入額外的參數時,這種寫法就比較方便了。

class MyComponent extends React.Component {    ……  render() {    const type = 1;    return (      /* 事件屬性賦值和this綁定同時 */      <button onClick={this.handleClick.bind(this, type)}>        Click      </button>      )  }}

屬性初始化語法

使用ES7的property initializers會自動為class中定義的方法綁定this。例如:

class MyComponent extends React.Component {  constructor(props) {    super(props);    this.state = {      number: 0    };  }  handleClick = (event) => {    const number = ++this.state.number;    this.setState({      number: number    });  }  render() {    return (      <button onClick={this.handleClick}>        Click      </button>      )  }}

這種方式既不需要在構造函數中手動綁定this,也不需要擔心組件重復渲染導致的函數重復創建的問題。不過由于property initializers 這個特性還處于試驗階段,默認有些瀏覽器是不支持的,需要使用babel來進行支持。

通過上面我們可以看到,只要處理好了React組件中函數的this綁定問題,React的事件處理就沒有太大的問題了。

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


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久免费视频在线观看| 国产精品 欧美在线| 欧美午夜女人视频在线| 18性欧美xxxⅹ性满足| 国产一区二区三区在线观看视频| 91在线视频导航| 久久精品99无色码中文字幕| 亚洲国产欧美一区二区三区同亚洲| 97在线观看视频国产| 亚洲精品自在久久| 久久精品国产欧美亚洲人人爽| 中国人与牲禽动交精品| 尤物yw午夜国产精品视频明星| 最近日韩中文字幕中文| 91精品国产高清久久久久久久久| 久久久女人电视剧免费播放下载| 国产xxx69麻豆国语对白| 97婷婷涩涩精品一区| 91久久精品久久国产性色也91| 日韩性xxxx爱| 国产精品久久99久久| 国外日韩电影在线观看| 亚洲福利影片在线| 亚洲综合日韩中文字幕v在线| 亚洲最大的av网站| 亚洲国产精品成人av| 国产成人久久精品| 欧美精品福利在线| 亚洲欧美日韩国产精品| 91精品国产自产在线观看永久| 日产日韩在线亚洲欧美| 91丝袜美腿美女视频网站| 国产美女扒开尿口久久久| 亚洲xxxx妇黄裸体| 成人黄色生活片| 亚洲第一精品福利| 日韩高清电影免费观看完整版| 亚洲美女av在线播放| 亚洲qvod图片区电影| 成人黄色中文字幕| 国产亚洲xxx| 成人黄色片网站| 欧美巨乳在线观看| 亚洲自拍欧美色图| 成人国产精品色哟哟| 欧美电影电视剧在线观看| 亚洲欧美日本伦理| 成人网页在线免费观看| 2019日本中文字幕| 国产精品99久久久久久久久久久久| 日韩激情第一页| 国产精品无av码在线观看| 成人久久久久久久| 日本精品久久中文字幕佐佐木| 欧美第一页在线| 欧美日韩国产精品一区二区不卡中文| 日本精品在线视频| 国产日产久久高清欧美一区| 欧美专区福利在线| 91亚洲精品久久久| 欧美性69xxxx肥| 欧美大片va欧美在线播放| 国产综合久久久久| 91精品久久久久久久| 日韩亚洲第一页| 这里只有精品视频在线| 欧美中文字幕在线| 精品国产乱码久久久久久天美| 亚洲自拍在线观看| 97香蕉久久超级碰碰高清版| 亚洲欧美日韩图片| 国产日韩欧美一二三区| 亚洲成人中文字幕| 91免费高清视频| 91在线播放国产| 久久在线免费视频| xxxx欧美18另类的高清| 97久久久久久| 国产日韩欧美影视| 91亚洲精品视频| 亚洲精品免费在线视频| 91久久精品日日躁夜夜躁国产| 大桥未久av一区二区三区| 国内精品久久久久久中文字幕| 国产精品极品尤物在线观看| 国产精品影院在线观看| 久久久噜噜噜久噜久久| 成年人精品视频| 中文字幕v亚洲ⅴv天堂| 日韩色av导航| 97免费视频在线播放| 欧美一级淫片丝袜脚交| 成人网页在线免费观看| 亚洲欧洲一区二区三区在线观看| 欧美高清视频在线播放| 亚洲一区制服诱惑| 久久精品影视伊人网| 成人免费视频97| 欧美国产日产韩国视频| 久久精品视频在线播放| 国产精品jizz在线观看麻豆| 亚洲天堂日韩电影| 亚洲天堂成人在线| 少妇久久久久久| 午夜精品美女自拍福到在线| 亚洲xxxx视频| 国产精品观看在线亚洲人成网| 中文字幕亚洲综合久久| 欧美自拍视频在线观看| 这里只有精品丝袜| 美日韩精品免费观看视频| 日韩欧美国产成人| 欧美在线视频免费观看| 欧美成年人视频网站欧美| 久久久人成影片一区二区三区观看| 中文字幕在线观看日韩| 国产美女精彩久久| 欧美成人精品激情在线观看| 91在线观看免费高清完整版在线观看| 亚洲精品电影在线观看| 日韩在线观看免费av| 91成人在线播放| 韩国三级日本三级少妇99| 欧美日韩中文在线观看| 亚洲女同性videos| 欧美激情精品久久久| 成人午夜在线影院| 国产欧美一区二区三区久久人妖| 黄色精品在线看| 78色国产精品| 精品久久久国产| 日韩精品在线播放| 亚洲精品动漫100p| 国产婷婷色综合av蜜臀av| 日韩高清a**址| 91啪国产在线| 成人激情在线观看| 日韩电影免费在线观看| 欧美日韩国产精品| 欧美极品少妇与黑人| 久久夜色精品国产亚洲aⅴ| 97视频在线观看网址| 色综合色综合网色综合| 久久久久久这里只有精品| 国产v综合ⅴ日韩v欧美大片| 97婷婷涩涩精品一区| 亚洲人成网站色ww在线| 欧美黑人xxx| 国产v综合ⅴ日韩v欧美大片| 91免费高清视频| 欧美有码在线视频| 91高清免费在线观看| www日韩中文字幕在线看| 国产日韩欧美在线视频观看| 日韩欧美国产免费播放| 亚洲图片欧美日产| 亚洲精品成人久久| 欧美激情在线狂野欧美精品| 亚洲人成五月天| 麻豆国产va免费精品高清在线| 日本国产欧美一区二区三区| 精品中文字幕乱| 亚洲最大av网| 久久精品中文字幕一区|