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

首頁 > 編程 > JavaScript > 正文

React事件處理的機制及原理

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

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的事件處理就沒有太大的問題了。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
51久久精品夜色国产麻豆| 亚洲人成电影网站色www| 亚洲男人av在线| 国产在线98福利播放视频| 国产精品99久久久久久久久| 欧美日韩一区二区三区在线免费观看| 成人性生交大片免费看视频直播| 久久久久久高潮国产精品视| 日韩中文字幕网站| 国产一区二区色| 2020欧美日韩在线视频| 久久九九热免费视频| 久久综合伊人77777| 中文字幕亚洲图片| 亚洲欧美日韩天堂一区二区| 色偷偷噜噜噜亚洲男人的天堂| 亚洲iv一区二区三区| 97精品国产91久久久久久| 一本色道久久综合狠狠躁篇的优点| 国产69精品久久久久9999| 91精品国产777在线观看| 亚洲精品资源美女情侣酒店| 成人免费午夜电影| 亚洲国产婷婷香蕉久久久久久| 自拍偷拍亚洲一区| 欧美精品久久久久久久| 欧美日韩在线一区| 国产精品草莓在线免费观看| 欧美极品美女视频网站在线观看免费| 亚洲国产中文字幕在线观看| 亚洲香蕉av在线一区二区三区| 欧美日韩精品在线播放| 国产精品自拍偷拍| 精品成人国产在线观看男人呻吟| 精品国产一区久久久| 在线观看国产精品日韩av| 久久综合免费视频| 欧洲精品久久久| 亚洲在线第一页| 中文字幕亚洲国产| 九九热精品视频国产| 色狠狠久久aa北条麻妃| 7777免费精品视频| 成人黄色在线免费| 国产精品av免费在线观看| 欧美成人免费全部| 97久久伊人激情网| 欧美高清电影在线看| 97超视频免费观看| 欧美精品免费在线| 成人网址在线观看| 日韩精品极品在线观看| 国产精品久久精品| 精品久久久久久中文字幕大豆网| 日韩av电影手机在线| 国产mv免费观看入口亚洲| 国产中文字幕亚洲| 色婷婷久久一区二区| 色老头一区二区三区在线观看| 国产亚洲欧美另类中文| 狠狠久久亚洲欧美专区| 亚洲电影在线观看| 欧美福利在线观看| 国产精品视频自在线| 久热精品视频在线观看一区| 91精品久久久久久久久久久久久久| 国产拍精品一二三| 国产裸体写真av一区二区| 欧美黑人巨大精品一区二区| 亚洲国产精彩中文乱码av在线播放| 欧美日韩国产成人| 国产精品精品一区二区三区午夜版| 亚洲春色另类小说| 欧美极品第一页| 国内免费精品永久在线视频| 久久亚洲精品国产亚洲老地址| 久久久亚洲影院你懂的| 国产在线视频欧美| 国产精品日韩av| 26uuu另类亚洲欧美日本一| 久久久久久久久电影| 亚洲精品综合精品自拍| 欧美国产极速在线| 国产精品第三页| 亚洲精品日韩久久久| 精品久久在线播放| 欧美精品激情在线| 精品久久久999| 精品动漫一区二区| 国产成人精品一区二区| 亚洲欧美综合图区| 亚洲乱码av中文一区二区| 国产精品1区2区在线观看| 国产精品大陆在线观看| 精品久久久久久中文字幕大豆网| 国产一区二区美女视频| 久久久久久久爱| 欧美激情亚洲综合一区| 欧美影院久久久| 日韩毛片中文字幕| 欧美一区第一页| 538国产精品一区二区免费视频| 久久久久久久久久久成人| 亚洲激情在线观看| 亚洲嫩模很污视频| 亚洲国产精久久久久久久| 全色精品综合影院| 97香蕉久久夜色精品国产| 欧美激情免费观看| 国产精品88a∨| 久久天天躁夜夜躁狠狠躁2022| 中文字幕在线观看日韩| 久久av在线看| 国内精品小视频| 精品国内产的精品视频在线观看| 国内精品久久久久久久| 亚洲第一天堂无码专区| 亚洲国产精品va在看黑人| 在线播放国产一区二区三区| 成人久久一区二区| 久久成人一区二区| 国产日本欧美一区二区三区| 国产不卡在线观看| 国产成人黄色av| 国产精品久久久久久久久久免费| 久久综合国产精品台湾中文娱乐网| 日韩成人网免费视频| 欧美极品少妇xxxxⅹ免费视频| 亚洲精品影视在线观看| 在线观看亚洲视频| 亚洲激情免费观看| 亚洲第一区中文99精品| 国产女人精品视频| 日韩中文字幕在线播放| 亚洲电影免费观看| 欧美资源在线观看| 国产成人极品视频| 国产精品久久久久秋霞鲁丝| 91sao在线观看国产| 不卡av电影在线观看| 国产成人精品一区二区在线| 日韩精品中文字幕在线播放| 人人澡人人澡人人看欧美| 国产精品白丝av嫩草影院| 国产一区私人高清影院| 国产精品视频导航| 欧美美最猛性xxxxxx| 国产女同一区二区| 欧美国产日韩精品| 欧美成人三级视频网站| 国产精品美女www爽爽爽视频| 欧美性xxxx18| 中文字幕在线看视频国产欧美| 欧美电影免费观看网站| 欧美大片在线看免费观看| 亚洲va久久久噜噜噜久久天堂| 欧美视频在线观看免费| 久久久久久久一区二区| 91av视频在线| 欧美激情视频一区| 最近2019年好看中文字幕视频| 国产日韩亚洲欧美| 日韩久久免费电影| 亚洲剧情一区二区|