react點擊事件的幾種寫法是什麼
寫法:1、用「onClick={this.handleClick}」;2、用「onClick={this.handleClick.bind(this)}」;3、用「{(params)=> this.handleClick(params)}」。
本教學操作環境: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: undefined##分析:當點擊Button,呼叫handleClick事件處理函數,
- 因為handleClick是一個普通函數,因此this是執行時上下文的this ,
- handleClick在頁面中點擊Button時執行的,上下文環境是html的那個頁面
- 所以this是undefined,並不指向examplePage
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綁定了一個箭頭函數render() { return ( <p> // 通过箭头函数传参 <Button onClick = { (params) => this.handleClick(params) }></Button> </p> )}
- 點擊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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

React前後端分離指南:如何實現前後端的解耦和獨立部署,需要具體程式碼範例在當今的Web開發環境中,前後端分離已經成為一種趨勢。透過將前端和後端程式碼分開,可以讓開發工作更加靈活、高效,並且方便進行團隊協作。本文將介紹如何使用React實現前後端分離,從而實現解耦和獨立部署的目標。首先,我們要先理解什麼是前後端分離。傳統的Web開發模式中,前端和後端是耦合在

如何利用React和RabbitMQ建立可靠的訊息傳遞應用程式引言:現代化的應用程式需要支援可靠的訊息傳遞,以實現即時更新和資料同步等功能。 React是一種流行的JavaScript庫,用於建立使用者介面,而RabbitMQ是一種可靠的訊息傳遞中間件。本文將介紹如何結合React和RabbitMQ建立可靠的訊息傳遞應用,並提供具體的程式碼範例。 RabbitMQ概述:

ReactRouter使用指南:如何實現前端路由控制隨著單頁應用的流行,前端路由成為了一個不可忽視的重要部分。 ReactRouter作為React生態系統中最受歡迎的路由庫,提供了豐富的功能和易用的API,使得前端路由的實作變得非常簡單和靈活。本文將介紹ReactRouter的使用方法,並提供一些具體的程式碼範例。安裝ReactRouter首先,我們需要

PHP、Vue和React:如何選擇最適合的前端框架?隨著互聯網技術的不斷發展,前端框架在Web開發中起著至關重要的作用。 PHP、Vue和React作為三種代表性的前端框架,每一種都具有其獨特的特徵和優勢。在選擇使用哪種前端框架時,開發人員需要根據專案需求、團隊技能和個人偏好做出明智的決策。本文將透過比較PHP、Vue和React這三種前端框架的特徵和使

Java框架與React框架的整合:步驟:設定後端Java框架。建立專案結構。配置建置工具。建立React應用程式。編寫RESTAPI端點。配置通訊機制。實戰案例(SpringBoot+React):Java程式碼:定義RESTfulAPI控制器。 React程式碼:取得並顯示API回傳的資料。

如何利用React開發一個響應式的後台管理系統隨著互聯網的快速發展,越來越多的企業和組織需要一個高效、靈活、易於管理的後台管理系統來處理日常的操作事務。 React作為目前最受歡迎的JavaScript庫之一,提供了一種簡潔、高效和可維護的方式來建立使用者介面。本文將介紹如何利用React開發一個響應式的後台管理系統,並給出具體的程式碼範例。建立React專案首先

Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

react有事件處理函數、useEffect和useCallback、高階元件等等閉包。詳細介紹:1、事件處理函數閉包:在React中,當我們在元件中定義事件處理函數時,函數會形成一個閉包,可以存取元件作用域內的狀態和屬性。這樣可以在事件處理函數中使用元件的狀態和屬性,實現互動邏輯;2、useEffect和useCallback中的閉包等等。
