目錄
react點擊事件的幾種寫法是什麼
this的指向分析" >this的指向分析
1. onClick = { this.handleClick } 箭頭函數" >1. onClick = { this.handleClick } 箭頭函數
首頁 web前端 前端問答 react點擊事件的幾種寫法是什麼

react點擊事件的幾種寫法是什麼

Apr 22, 2022 am 10:28 AM
react

寫法:1、用「onClick={this.handleClick}」;2、用「onClick={this.handleClick.bind(this)}」;3、用「{(params)=> this.handleClick(params)}」。

react點擊事件的幾種寫法是什麼

本教學操作環境:Windows10系統、react17.0.1版、Dell G3電腦。

react點擊事件的幾種寫法是什麼

開門見山,先直接給出為一個button添加一個事件的正確寫法:

為一個button添加一個onclick事件的正確寫法

  • 不傳參數

// handleClick用<箭頭函數> 定義
onClick = { this.handleClick }

// handleClick用箭头函数定义时,为onClick添加事件应该这么写:&lt;Button onClick = { this.handleClick }&gt;&lt;/Button&gt;
登入後複製

handleClick這麼定義:

handleClick = () =&gt; { // do something here};
登入後複製

// handleClick用(普通函數)定義
onClick = { this.handleClick .bind(this) }

// handleClick用普通函数定义时,为onClick添加事件应该这么写:&lt;Button onClick = { this.handleClick.bind(this) }&gt;&lt;/Button&gt;
登入後複製

handleClick這麼定義:

handleClick () { // do something here }
登入後複製
  • 傳參數

// handleClick用<箭頭函數>/(普通函數) 定義都可以
onClick = { (params) => this.handleClick(params) }

 // handleClick可以是箭头函数,也可以是普通函数&lt;Button onClick = { (params) =&gt; this.handleClick(params) }&gt;&lt;/Button&gt;
登入後複製

接下來分析為什麼這樣寫是正確的:

this的指向分析

理解這個問題,帶著下面這幾句去理解:

箭頭函數,沒有自己的this,所以它的this是: 定義時上下文的this
普通函數,有自己的this,所以它的this是:執行時上下文的this

#先來看第一種寫法:

1. onClick = { this.handleClick } 箭頭函數

下面給出的程式碼為:為一個按鈕新增onclick事件(一個完整的jsx)

// examplePage.jsximport React from 'react';import { Button } from 'antd';class examplePage extends React.Component {
    // 2. 定义handleClick事件
    handleClick = () =&gt; {
        console.log(this); //3. this指向examplePage
    }

    render() {
        return (
            &lt;p&gt;
            // 1. 为onClick绑定 handleClick事件处理函数
                &lt;Button onClick = { this.handleClick }&gt;click me&lt;/Button&gt;
            &lt;/p&gt;
        )
    }}export default examplePage;
登入後複製

點擊按鈕,印出指向examplePage的this:

this: examplePage {props: Object, context: {}, refs: {}, updater: Object , state: {}, …}

分析:

  • 當點選Button,呼叫handleClick事件處理函數,
  • 因為handleClick是一個箭頭函數,因此this是定義時上下文的this ,
  • handleClick在class examplePage 中定義的,
  • 所以this指向examplePage
  • ##再看如果把箭頭函數改為普通函數的情況:

2. onClick = { this.handleClick.bind(this) } 普通函數

先來看,如果不用bind(this) ,console.log(this)會輸出什麼:

// examplePage.jsximport React from 'react';import { Button } from 'antd';class examplePage extends React.Component {
    // 2. !将箭头函数改为普通函数
    handleClick () {
        console.log(this); // 3. this 为 undefined
    }

    render() {
        return (
            &lt;p&gt;
            // 1. 为onClick绑定 handleClick事件处理函数
                &lt;Button onClick = { this.handleClick }&gt;click me&lt;/Button&gt;
            &lt;/p&gt;
        )
    }}export default examplePage;
登入後複製
點擊按鈕,列印this:

this: undefined

##分析:

當點擊Button,呼叫handleClick事件處理函數,
  • 因為handleClick是一個普通函數,因此this是執行時上下文的this ,
  • handleClick在頁面中點擊Button時執行的,上下文環境是html的那個頁面
  • 所以this是undefined,並不指向examplePage
註:在嚴格版中,預設的this不再是window,而是undefined
Module code is always strict mode code.

All parts of a ClassDeclaration or ClassExpression are strict mode code.

因此需要用bind來改變this指向,即:
render() {
    return (
        &lt;p&gt;
        // 用bind改变this指向
           &lt;Button onClick = { this.handleClick.bind(this) }&gt;click me&lt;/Button&gt;
        &lt;/p&gt;
    )}
登入後複製

分析:

當點選Button,呼叫handleClick事件處理函數,
  • 透過bind()函數,將render函數的this(指向class examplePage),當作一個變數傳入handleClick
  • 本來handleClick是一個普通函數, this是執行時上下文的this(即undefined),但因為bind(this)傳入- - 了指向examplePage的指向this
  • 所以此時,this是指向examplePage,解決了this為undefined的問題
  • 理解了上面兩個,最後一個就很好理解了:

3. onClick = { (params) => this.handleClick(params) } 普通函數/箭頭函數都可

render() {
    return (
        &lt;p&gt;
        // 通过箭头函数传参
           &lt;Button onClick = { (params) =&gt; this.handleClick(params) }&gt;&lt;/Button&gt;
        &lt;/p&gt;
    )}
登入後複製
分析:

透過箭頭函數傳遞參數,相當於onClick綁定了一個箭頭函數
  • 點擊Button時,呼叫(params) => this.handleClick(params)這個箭頭函數,因此this是定義時上下文的this ,
  • handleClick在class examplePage 中定義的,
  • 所以this指向examplePage
  • 按這種思路,只要把onClick的回應事件用箭頭函數來寫,調用的時候,this指向的都是該元件class,就不會有問題
  • 那麼,不傳參的時候,就這麼寫:
&lt;Button onClick = { () =&gt; this.handleClick() }&gt;&lt;/Button&gt;
登入後複製

但這是不可行的,因為react會直接解析()=> this.handleClick(), handleClick會被調用,相當於onClick = “調用handleClick的結果”

所以,不傳參數的時候只能這麼寫:

&lt;Button onClick = { this.handleClick }&gt;&lt;/Button&gt;
登入後複製

總結

開頭的三個問題可以得到答案

  • 什么情况下需要bind(this)?
    答: onClick传入的事件处理函数是普通函数的时候,需要bind(this)来改变指向
  • 为什么要用bind(this)?
    答:如果不用bind(this), this会指向undefined
  • 可以不用bind(this)吗?
    答:用箭头函数 (用箭头函数定义事件处理函数)
//定义handleClick事件
handleClick = () =&gt; {
      // do something here
};

//为onClick绑定handleClick事件处理函数
&lt;Button onClick = {this.handleClick}&gt;&lt;/Button&gt; // 不传参
&lt;Button onClick = {(param) =&gt; this.handleClick(param) }&gt;&lt;/Button&gt; // 传参
登入後複製

推荐学习:《react视频教程

以上是react點擊事件的幾種寫法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何利用React和WebSocket建立即時聊天應用 如何利用React和WebSocket建立即時聊天應用 Sep 26, 2023 pm 07:46 PM

如何利用React和WebSocket建立即時聊天應用

React前後端分離指南:如何實作前後端的解耦與獨立部署 React前後端分離指南:如何實作前後端的解耦與獨立部署 Sep 28, 2023 am 10:48 AM

React前後端分離指南:如何實作前後端的解耦與獨立部署

如何利用React和Flask建構簡單易用的網路應用 如何利用React和Flask建構簡單易用的網路應用 Sep 27, 2023 am 11:09 AM

如何利用React和Flask建構簡單易用的網路應用

如何利用React和RabbitMQ建立可靠的訊息應用 如何利用React和RabbitMQ建立可靠的訊息應用 Sep 28, 2023 pm 08:24 PM

如何利用React和RabbitMQ建立可靠的訊息應用

如何利用React和Google BigQuery建立快速的資料分析應用 如何利用React和Google BigQuery建立快速的資料分析應用 Sep 26, 2023 pm 06:12 PM

如何利用React和Google BigQuery建立快速的資料分析應用

React程式碼偵錯指南:如何快速定位與解決前端bug React程式碼偵錯指南:如何快速定位與解決前端bug Sep 26, 2023 pm 02:25 PM

React程式碼偵錯指南:如何快速定位與解決前端bug

React Router使用指南:如何實現前端路由控制 React Router使用指南:如何實現前端路由控制 Sep 29, 2023 pm 05:45 PM

React Router使用指南:如何實現前端路由控制

React響應式設計指南:如何實現自適應的前端佈局效果 React響應式設計指南:如何實現自適應的前端佈局效果 Sep 26, 2023 am 11:34 AM

React響應式設計指南:如何實現自適應的前端佈局效果

See all articles