欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React事件處理超詳細介紹

 更新時間:2022年09月30日 09:42:34   作者:月光曬了很涼快  
這篇文章主要介紹了React事件處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1. 事件綁定

React 元素的事件處理和 DOM 元素的很相似,但是有一點語法上的不同:

React 事件的命名采用小駝峰式,而不是純小寫。

onClick => onChange

使用 JSX 語法時你需要傳入一個函數(shù)作為事件處理函數(shù),而不是一個字符串。

onClick={this.fn} // 綁定實現(xiàn)方法一定要用 {函數(shù)或方法};注意函數(shù)或方法不能用小括號

類組件與函數(shù)組件綁定事件是差不多的,只是在類組件中綁定事件函數(shù)的時候需要用到 this,代表指向當前的類的引用,在函數(shù)中不需要調(diào)用 this

1.1 函數(shù)組件

import React, { Component } from 'react'
// 函數(shù)組件中沒有this指向問題
const App = () => {
  let num = 1
  const clickFn = () => {
    console.log(num++)
  }
  // const clickFn = () => () => {
  //   console.log(num++)
  // }
  return (
    <div>
      {/* 普通的值,它不具備響應式,所以你修改數(shù)據(jù)后,視圖是不會更新的 */}
      <h3>App組件 -- {num}</h3>
      {/* 綁定點擊事件 */}
      {/* 一般情況下,綁定的實現(xiàn)方法是不會加小括號,如果要加小括號,則定義綁定方法時,一定要返回一函數(shù) */}
      <button onClick={clickFn}>++++</button>
      {/* <button onClick={clickFn()}>++++</button> */}
    </div>
  )
}
export default App

1.2 類組件

import React, { Component } from 'react'
class App extends Component {
  num = 100
  todos = []
  // 建議使用箭頭函數(shù)定義成員屬性
  addNum = () => {
    // 同步修改成員屬性中的數(shù)據(jù),但是視圖不更新
    this.num++
    // 類組件中提供一個方法,可以強制讓視圖更新
    this.forceUpdate()
  }
  // react事件,在沒有寫小括號的時候會主動的把event對象傳給你
  onEnter = evt => {
    if (evt.keyCode === 13) {
      this.todos.push({
        id: Date.now(),
        title: evt.target.value.trim(),
        done: false
      })
      evt.target.value = ''
      // 通知視圖更新
      this.forceUpdate()
    }
  }
  render() {
    return (
      <div>
        <h3>{this.num}</h3>
        <ul>
          {this.todos.map(item => (
            <li key={item.id}>{item.title}</li>
          ))}
        </ul>
        {/* 
          類組件中綁定方法,有this指向問題
        */}
        <button onClick={this.addNum}>++++</button>
        <input type="text" onKeyUp={this.onEnter} />
      </div>
    )
  }
}
export default App

2. 合成事件

概述:

在原生 Dom 事件( html 中),假如我們給 button 按鈕綁定點擊事件,是綁定在 button 上去的。而這種情況在 React 中,不會在 button 上綁定事件,React 會將 Dom 中的事件進行收集,然后將事件委托到容器中(id=root,即掛載點)。

在 React16 及之前,React 將所有的事件都委托到 document 當中去,而在 React17 及之后,React 將所有的事件都委托到掛載點中去了。

為什么出現(xiàn)這個技術(shù)?

  • 性能優(yōu)化:使用事件代理統(tǒng)一接收原生事件的觸發(fā),從而可以使得真實 DOM 上不用綁定事件。React 挾持事件觸發(fā)可以知道用戶觸發(fā)了什么事件,是通過什么原生事件調(diào)用的真實事件。這樣可以通過對原生事件的優(yōu)先級定義進而確定真實事件的優(yōu)先級,再進而可以確定真實事件內(nèi)觸發(fā)的更新是什么優(yōu)先級,最終可以決定對應的更新應該在什么時機更新。
  • 分層設計:解決跨平臺問題,抹平瀏覽器差異和平臺差異。

3. 事件傳參的3種不同寫法

import React, { Component } from 'react';
class App extends Component {
  // 在react中事件對象,它是通過事件參數(shù)傳給方法的
  // 參數(shù)空著,會默認綁定事件
  fn = () => {
    console.log('fn')
  }
  // 又想傳參,又想觸發(fā)事件得這么寫,evt會自動映射過來,注意最后一個箭頭前只能是 evt 對象
  fn1 = num => evt => {
    console.log(num, evt);
  }
  // 這種寫法是可以隨意變更 evt 對象傳參過來的位置
  fn2 = (num, evt) => {
    console.log(num, evt);
  }
  render() {
    return (
      <div>
        {/* onClick={ 注意:花括號里是函數(shù)的表達式,而不是函數(shù)的調(diào)用 } */}
        <button onClick={this.fn}>綁定點擊事件</button>
        <button onClick={this.fn1(100)}>綁定點擊事件</button>
        <button onClick={evt => this.fn2(200, evt)}>綁定點擊事件</button>
      </div>
    );
  }
}
export default App;

4. this 指向問題

在JSX事件函數(shù)方法中的 this,默認不會綁定 this 指向。如果你忘記綁定,當你調(diào)用這方法的時候,this 的值為 undefined。所以使用時一定要綁定好 this 的指向。

this 指向針對的是類組件,函數(shù)組件沒有 this 問題,因為函數(shù)沒有 this 。

利用 bind 函數(shù)綁定 this 指向:

import React, { Component } from 'react';
class App extends Component {
  num = 100
  // 類的構(gòu)造函數(shù),它只執(zhí)行1次,在初始化
  // constructor(props) {
  //   super(props);
  //   // 在構(gòu)建函數(shù)中統(tǒng)一的把事件方法this綁定好
  //   this.addNum = this.addNum.bind(this)
  // }
  // 在react事件綁定的類組件中,默認情況this指向會可能存在指向問題  undefined
  // 在綁定事件中綁定this調(diào)用函數(shù)時的寫法
  addNum(n = 1) {
    this.num += n
    this.forceUpdate()
  }
  // 構(gòu)造函數(shù)中綁定this調(diào)用函數(shù)時的寫法,因為不傳值第一個參數(shù)會
  // addNum(evt, n = 1) {
  //   this.num += n
  //   this.forceUpdate()
  // }
  render() {
    return (
      <div>
        <h3>{this.num}</h3>
        {/* 在此處可以使用bind來綁定this指向(this指向 App 實例),且還可以傳參數(shù) */}
        {/* 此方案在使用中,較多 */}
        {/* <button onClick={this.addNum.bind(this)}>累加</button> */}
        <button onClick={this.addNum.bind(this, 2)}>累加</button>
        {/* 如果你這樣寫,又想this指向?qū)?,則一定要在構(gòu)造函數(shù)中,解決好this指向 */}
        {/* <button onClick={this.addNum}>累加</button> */}
      </div>
    );
  }
}
export default App;

注意:使用 bind 綁定 this 共有兩種方案,一種是調(diào)用函數(shù)時綁定,一種是在構(gòu)造函數(shù)中統(tǒng)一綁定。

利用箭頭函數(shù)解決 this 指向:

import React, { Component } from 'react';
class App extends Component {
  num = 100
  // 類的構(gòu)造函數(shù),它只執(zhí)行1次,在初始化
  // constructor(props) {
  //   super(props);
  //   // 在構(gòu)建函數(shù)中統(tǒng)一的把事件方法this綁定好
  //   this.addNum = this.addNum.bind(this)
  // }
  // 在react事件綁定的類組件中,默認情況this指向會可能存在指向問題  undefined
  // 在綁定事件中綁定this調(diào)用函數(shù)時的寫法
  addNum(n = 1) {
    this.num += n
    this.forceUpdate()
  }
  // 構(gòu)造函數(shù)中綁定this調(diào)用函數(shù)時的寫法,因為不傳值第一個參數(shù)會
  // addNum(evt, n = 1) {
  //   this.num += n
  //   this.forceUpdate()
  // }
  render() {
    return (
      <div>
        <h3>{this.num}</h3>
        {/* 在此處可以使用bind來綁定this指向(this指向 App 實例),且還可以傳參數(shù) */}
        {/* 此方案在使用中,較多 */}
        {/* <button onClick={this.addNum.bind(this)}>累加</button> */}
        <button onClick={this.addNum.bind(this, 2)}>累加</button>
        {/* 如果你這樣寫,又想this指向?qū)?,則一定要在構(gòu)造函數(shù)中,解決好this指向 */}
        {/* <button onClick={this.addNum}>累加</button> */}
      </div>
    );
  }
}
export default App;

到此這篇關(guān)于React事件處理超詳細介紹的文章就介紹到這了,更多相關(guān)React事件處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • webpack 2的react開發(fā)配置實例代碼

    webpack 2的react開發(fā)配置實例代碼

    本篇文章主要介紹了webpack 2的react開發(fā)配置實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 一文搞懂?React?18?中的?useTransition()?與?useDeferredValue()

    一文搞懂?React?18?中的?useTransition()?與?useDeferredValue()

    這篇文章主要介紹了一文搞懂?React?18?中的?useTransition()與useDeferredValue(),文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • react為什么不推薦使用index作為key

    react為什么不推薦使用index作為key

    本文主要介紹了react為什么不推薦使用index作為key,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • react如何實現(xiàn)一個密碼強度檢測器詳解

    react如何實現(xiàn)一個密碼強度檢測器詳解

    這篇文章主要給大家介紹了關(guān)于react如何實現(xiàn)一個密碼強度檢測器的相關(guān)資料,使用這個密碼強度器后可以幫助大家提高在線帳號、個人信息的安全性,需要的朋友可以參考下
    2021-06-06
  • React實現(xiàn)監(jiān)聽粘貼事件并獲取粘貼板中的截圖

    React實現(xiàn)監(jiān)聽粘貼事件并獲取粘貼板中的截圖

    這篇文章主要介紹了React實現(xiàn)監(jiān)聽粘貼事件并獲取粘貼板中的截圖方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • React教程之Props驗證的具體用法(Props Validation)

    React教程之Props驗證的具體用法(Props Validation)

    這篇文章主要介紹了React教程之Props驗證的具體用法(Props Validation),非常具有實用價值,需要的朋友可以參考下
    2017-09-09
  • 詳解如何封裝和使用一個React鑒權(quán)組件

    詳解如何封裝和使用一個React鑒權(quán)組件

    JavaScript?和?React?提供了靈活的事件處理機制,特別是通過利用事件的捕獲階段來阻止事件傳播可以實現(xiàn)精細的權(quán)限控制,本文將詳細介紹這一技術(shù)的應用,并通過實踐案例展示如何封裝和使用一個?React?鑒權(quán)組件,需要的可以參考下
    2024-03-03
  • react-router?v6實現(xiàn)權(quán)限管理+自動替換頁面標題的案例

    react-router?v6實現(xiàn)權(quán)限管理+自動替換頁面標題的案例

    這篇文章主要介紹了react-router?v6實現(xiàn)權(quán)限管理+自動替換頁面標題,這次項目是有三種權(quán)限,分別是用戶,商家以及管理員,這次寫的權(quán)限管理是高級權(quán)限能訪問低級權(quán)限的所有頁面,但是低級權(quán)限不能訪問高級權(quán)限的頁面,需要的朋友可以參考下
    2023-05-05
  • 淺談React中組件邏輯復用的那些事兒

    淺談React中組件邏輯復用的那些事兒

    這篇文章主要介紹了淺談React中組件邏輯復用的那些事兒,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • 關(guān)于React動態(tài)修改元素樣式的三種方式

    關(guān)于React動態(tài)修改元素樣式的三種方式

    這篇文章主要介紹了關(guān)于React動態(tài)修改元素樣式的三種方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論