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

首頁 > 語言 > JavaScript > 正文

在React中如何優雅的處理事件響應詳解

2024-05-06 15:13:59
字體:
來源:轉載
供稿:網友

前言

本文主要給大家介紹的是關于React處理事件響應的相關內容,分享出來供大家參考學習,下面來一起看看詳細的介紹吧。

React中定義一個組件,可以通過React.createClass或者ES6的class。本文討論的React組件是基于class定義的組件。采用class的方式,代碼結構更加清晰,可讀性強,而且React官方也推薦使用這種方式定義組件。

處理事件響應是Web應用中非常重要的一部分。React中,處理事件響應的方式有多種。

一、使用箭頭函數

先上代碼:

//代碼1class MyComponent extends React.Component { render() { return (  <button onClick={()=>{console.log('button clicked');}}>  Click  </button> ); }}

當事件響應邏輯比較復雜時,再把所有的邏輯直接寫在onClick的大括號內,就會導致render函數變得臃腫,不容易直觀地看出組件render出的元素結構。這時,可以把邏輯封裝成組件的一個方法,然后在箭頭函數中調用這個方法。

如下所示:

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

這種方式最大的問題是,每次render調用時,都會重新創建一個事件的回調函數,帶來額外的性能開銷,當組件的層級越低時,這種開銷就越大,因為任何一個上層組件的變化都可能會觸發這個組件的render方法。當然,在大多數情況下,這點性能損失是可以不必在意的。這種方式也有一個好處,就是不需要考慮this的指向問題,因為這種寫法保證箭頭函數中的this指向的總是當前組件。

二、使用組件方法

代碼先:

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

這種方式的好處是每次render,不會重新創建一個回調函數,沒有額外的性能損失。需要注意的是,使用這種方式要在構造函數中為事件回調函數綁定this: this.handleClick = this.handleClick.bind(this) ,否則handleClick中的this是undefined。這是因為ES6 語法的緣故,ES6 的 Class 構造出來的對象上的方法默認不綁定到 this 上,需要我們手動綁定。每次都手動綁定this是不是有點蛋疼?好吧,讓我們來看下一種方式。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 古丈县| 玉龙| 太湖县| 宁德市| 泉州市| 南京市| 顺平县| 宁晋县| 绵竹市| 仁寿县| 日喀则市| 德安县| 枝江市| 黄冈市| 丁青县| 琼中| 佛学| 广平县| 西盟| 仁化县| 贵港市| 上杭县| 凭祥市| 辽阳县| 元阳县| 泰顺县| 开远市| 五大连池市| 高雄市| 淮南市| 新巴尔虎左旗| 神农架林区| 桦南县| 怀安县| 台北市| 宝兴县| 朝阳县| 雷州市| 丰都县| 东乡| 武冈市|