1. 程式人生 > >React事件處理函式中繫結this的bind()函式

React事件處理函式中繫結this的bind()函式

今天在看最新的React官方教程時發現了一個問題,開始全面使用ES6語法的React在Handling Events這節中,提到了繫結的事件處理函式要現在建構函式中使用bind()將this進行正確的繫結,涉及到的程式碼如下:

class Toggle extends React.Component {
  constructor(props) {
    super(props);
    this.state = {isToggleOn: true};

    // This binding is necessary to make `this` work in the callback
this.handleClick = this.handleClick.bind(this); } handleClick() { this.setState(prevState => ({ isToggleOn: !prevState.isToggleOn })); } render() { return ( <button onClick={this.handleClick}> {this.state.isToggleOn ? 'ON' : 'OFF'} </button> ); } }

之前就一直對bind()函式理解不夠深入,這裡使用bind()的作用一開始不是很明白,就在網上查閱了資料,在MDN技術文件中找到了這一函式的具體作用如下:
bind()方法會建立一個新函式,當這個新函式被呼叫時,它的this值是傳遞給bind()的第一個引數, 它的引數是bind()的其他引數和其原本的引數.
之後在後面的一個例子很好的解釋了React這裡使用bind的作用:

建立繫結函式
bind() 最簡單的用法是建立一個函式,使這個函式不論怎麼呼叫都有同樣的 this 值。JavaScript新手經常犯的一個錯誤是將一個方法從物件中拿出來,然後再呼叫,希望方法中的 this 是原來的物件。(比如在回撥中傳入這個方法。)如果不做特殊處理的話,一般會丟失原來的物件。從原來的函式和原來的物件建立一個繫結函式,則能很漂亮地解決這個問題:

this.x = 9; 
var module = {
  x: 81,
  getX: function() { return this.x; }
};

module.getX(); // 返回 81

var retrieveX = module.getX;
retrieveX(); // 返回 9, 在這種情況下,"this"指向全域性作用域

// 建立一個新函式,將"this"繫結到module物件
// 新手可能會被全域性的x變數和module裡的屬性x所迷惑
var boundGetX = retrieveX.bind(module);
boundGetX(); // 返回 81

結合這裡的例子進行理解,React構造方法中的bind即將handleClick函式與這個元件Component進行繫結以確保在這個處理函式中使用this時可以時刻指向這一元件

相關推薦

React事件處理函式this的bind()函式

今天在看最新的React官方教程時發現了一個問題,開始全面使用ES6語法的React在Handling Events這節中,提到了繫結的事件處理函式要現在建構函式中使用bind()將this進行正確的繫結,涉及到的程式碼如下: class Toggle e

C++關於tr1成員函式的bind使用

 std::tr1::bind()模板函式的使用 通過上面的std::tr1::function 可以對靜態成員函式進行繫結,但如果要對非靜態成員函式的繫結,需用到下面將要介紹的bind()模板函式. 首先說bind的用法,其宣告如下所示: bind(Function fn

為什麼React事件處理函式必須使用Function.bind()this?

class Toggle extends React.Component { constructor(props) { super(props); this.state = {isToggleOn: true}; // This bind

Javascript事件函式加括號和不加括號的區別

今天在學習javascript中的時候遇到了一個問題,我將此問題簡化,抽取部分程式碼,如下: 說明:#fname為一個按鈕,test是一個普通函式 test函式 function test() { alert("執行test函式"); }

react事件處理,為類方法this

react事件繫結屬性的命名採用駝峰命名法, 如果採用JSX的語法,需要傳入一個函式作為事件處理函式,而不是一個字串(DOM元素的寫法)。 阻止事件的預設行為: 不能使用返回false的方式來阻止預設行為,必須明確的使用preventDefault 在類方法中繫

關於js事件失效問題

相信很多開始學習前端開發的朋友都發生過繫結事件失效的問題,那麼究竟是什麼原因使得事件失效呢? 這裡作者以jquery庫編寫作為例子。 第一種:直接失效。 <html> <head> <script type="text/javascript" src="/j

vueeventbus被多次觸發(vue使用eventbus踩過的坑)【bus.$on事件被多次

  問題描述:只要頁面沒有強制重新整理,存在元件切換,bus.$on方法會被多次繫結,造成事件多次觸發   觸發bus.$on中繫結的方法.png

Vue、React同一個dom元素如何多個點選事件

Vue:<button type="button" @click="a();b()">vue按鈕</button> React:<button type="button

React事件處理函式必須使用bind(this)的原因

轉載地址https://blog.csdn.net/qq_34829447/article/details/81705977 1.JavaScript自身特性說明 如果傳遞一個函式名給一個變數,之後通過函式名()的方式進行呼叫,在方法內部如果使用this則this的指

React應該如何優雅的事件

前言 由於JS的靈活性,我們在React中其實有很多種繫結事件的方式,然而,其實有許多我們常見的事件繫結,其實並不是高效的。所以本文想給大家介紹一下React繫結事件的正確姿勢。 常見兩種種錯誤繫結事件 class ErrorExample1 extends Comp

jq事件bind(),live(),delegate(),on()的優缺點

前言   因為專案中經常會有利用jquery操作dom元素的增刪操作,所以會涉及到dom元素的繫結事件方式,簡單的歸納一下bind,live,delegate,on的區別,以便以後查閱,也希望該文章日後能幫助到園友,文中如有不當之處,還望各位指正,話不多說,直接進入正題

libevent原始碼學習-----統一事件源及訊號函式

libevent在對檔案描述符,套接字進行監控時直接放到event,這些event通過io多路複用函式進行監控,然而對應訊號來說io複用函式卻無能為力,為了解決問題,libevent採用統一事件源的方式,即將訊號也表現成event的形式,用到了socketpai

JavaScript如何使addEventListener函式既能傳參還能解綁?

var btn = document.getElementsByClassName('btn')[0], remove = document.getElementsByClassName('remove')[0]; var some = function (msg) {

HTML給標籤的點選事件匿名函式

結果就是a1和a3的點選事件會正常執行,a2就會有錯誤。可是a1、a2、d3的點選事件的繫結方式都是一樣的使用匿名函式,而且a2和a3的匿名函式的寫法也都是"function(){}",為啥a2這種寫法不行呢?

事件處理過程遇到的問題

stop return 行為 post on() 遇到 false 過程 event 1.event.stopPropagation();   事件處理過程中,阻止了事件冒泡,但不會阻擊默認行為 2.return false;   事件處理過程中,阻止了事件冒泡,也阻止了默

React事件處理

點擊 .org onclick log ets 綁定 使用 amp org function ActionLink() { function handleClick(e) { e.preventDefault(); console.log(‘鏈接被點擊

事件小概念以及

事件: 使用者在瀏覽器操作的時候,觸發(複合某種條件)的一種互動行為(事件、事務)。 每個元素自身就有事件,只不過預設為null,當某個事件綁定了一個函式之後, 使用者在操作瀏覽器的時候,觸發了這個事件,那麼就執行事件函式。

std::bind 函式引數

std::bind 可以將一個多引數的函式轉化為一個少引數 或者無引數函式,上面的bind之後變為func(int value,1,5),函式簽名是bool (int)了 而非 bool(int,int,int) 1.如果需要把一個類中的函式轉換為全域性函式簽名,則std::bind(fun

React 事件處理

React 元素的事件處理和 DOM元素的很相似。但是有一點語法上的不同: React事件繫結屬性的命名採用駝峰式寫法,而不是小寫。 如果採用 JSX 的語法你需要傳入一個函式作為事件處理函式,而不是一個字串(DOM元素的寫法) 你必須謹慎對待 JSX 回撥函式中的&nb

jquery 的滑鼠事件/淡入淡出/

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>jquery的學習</title>  <!-