您好,登錄后才能下訂單哦!
這篇文章主要講解了“react點擊事件的寫法有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“react點擊事件的寫法有哪些”吧!
寫法: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: {}, …}
分析:
當點擊Button,調用handleClick事件處理函數,
因為handleClick是一個箭頭函數,因此 this是 定義時上下文的this ,
handleClick在class examplePage 中定義的 ,
所以this指向examplePage
再看如果把箭頭函數改為普通函數的情況:
先來看,如果不用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的問題
理解了上面兩個,最后一個就很好理解了:
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點擊事件的寫法有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。