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

WBOY
發布: 2022-04-22 10:28:08
原創
2658 人瀏覽過

寫法: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添加事件应该这么写:<Button onClick = { this.handleClick }></Button>
登入後複製

handleClick這麼定義:

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

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

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

handleClick這麼定義:

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

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

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

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

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 = () => {
        console.log(this); //3. this指向examplePage
    }

    render() {
        return (
            <p>
            // 1. 为onClick绑定 handleClick事件处理函数
                <Button onClick = { this.handleClick }>click me</Button>
            </p>
        )
    }}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 (
            <p>
            // 1. 为onClick绑定 handleClick事件处理函数
                <Button onClick = { this.handleClick }>click me</Button>
            </p>
        )
    }}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 (
        <p>
        // 用bind改变this指向
           <Button onClick = { this.handleClick.bind(this) }>click me</Button>
        </p>
    )}
登入後複製

分析:

當點選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 (
        <p>
        // 通过箭头函数传参
           <Button onClick = { (params) => this.handleClick(params) }></Button>
        </p>
    )}
登入後複製
分析:

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

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

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

<Button onClick = { this.handleClick }></Button>
登入後複製

總結

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

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

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

推荐学习:《react视频教程

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

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板