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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宝山区| 齐齐哈尔市| 平潭县| 涟水县| 毕节市| 侯马市| 大余县| 中山市| 涪陵区| 大英县| 荔浦县| 高密市| 莱州市| 全椒县| 蚌埠市| 镶黄旗| 敦煌市| 堆龙德庆县| 望城县| 含山县| 甘洛县| 海宁市| 毕节市| 太保市| 凤阳县| 濮阳县| 江华| 东乌珠穆沁旗| 共和县| 西乌珠穆沁旗| 开封市| 大渡口区| 遵义市| 兖州市| 蕉岭县| 连江县| 类乌齐县| 江门市| 大石桥市| 天柱县| 麦盖提县|