寫法:1、用「onClick={this.handleClick}」;2、用「onClick={this.handleClick.bind(this)}」;3、用「{(params)=> this.handleClick(params)}」。
本教學操作環境:Windows10系統、react17.0.1版、Dell G3電腦。
開門見山,先直接給出為一個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
#先來看第一種寫法:
下面給出的程式碼為:為一個按鈕新增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: {}, …}
分析:
// 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事件處理函數,
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事件處理函數,render() { return ( <p> // 通过箭头函数传参 <Button onClick = { (params) => this.handleClick(params) }></Button> </p> )}分析:
<Button onClick = { () => this.handleClick() }></Button>
但這是不可行的,因為react會直接解析()=> this.handleClick(), handleClick會被調用,相當於onClick = “調用handleClick的結果”
所以,不傳參數的時候只能這麼寫:
<Button onClick = { this.handleClick }></Button>
總結
開頭的三個問題可以得到答案//定义handleClick事件 handleClick = () => { // do something here }; //为onClick绑定handleClick事件处理函数 <Button onClick = {this.handleClick}></Button> // 不传参 <Button onClick = {(param) => this.handleClick(param) }></Button> // 传参
推荐学习:《react视频教程》
以上是react點擊事件的幾種寫法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!