1. 程式人生 > >React中文文件之Handling Events

React中文文件之Handling Events

Handling Events - 事件處理
React元素的事件處理同DOM元素的事件處理非常相似。
有一些語法不同:
1.React事件使用 'camelCase-駝峰式' 命名,而不是 'lowercase-小寫字母'
2.使用JSX,傳遞一個函式作為事件處理,而不是字串
例如:
HTML程式碼:
			<button onclick="activateLaser()">
				Activate Lasers
			</button>

略微不同於React:
			<button onClick="{activateLaser}">
				Activate Lasers
			</button>

另一個不同是,在React中,不能返回 'false' 來阻止預設行為。必須呼叫 'preventDefault'。例如,阻止連結開啟新頁面的預設行為:
HTML程式碼:
			<a href="#" onclick="console.log('The link was clicked.'); return false">
				Click me
			</a>
React程式碼:
			function ActionLink() {
				function handleClick(e) {
					e.preventDefault();
					console.log('The link was clicked');
				}	
				return  (
					<a href="#" onClick={handleClick}>
						Click me
					</a>
				);
			}

這裡,'e' 是一個合成事件(synthetic event)。React根據 W3C規範 定義這些合成事件,因此不需要擔心跨瀏覽器的相容問題。可檢視 'SyntheticEvent' 章節學習更多
當使用React,通常不需要呼叫 'addEventListener',給已經建立的DOM元素新增事件監聽。僅當最初渲染元素時,提供一個監聽器來代替。
當使用ES6類,定義了一個元件,一個常見的模式是:一個事件處理可定義為該類的一個方法。例如:Toggle元件來渲染一個按鈕,允許使用者切換 'ON' 和 'OFF' 狀態:
		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>
				);	
			}
		}
		ReactDOM.render(
			<Toggle />,
			document.getElementById('root')
		);


你不得不小心JSX回撥函式中的 'this' 的意思。在JS中,類方法預設沒有被繫結。如果你忘記繫結 'this.handleClick',並且傳遞給 'onClick',當函式被真實呼叫時,'this' 將會是 'undefined'。
這不是React特有的行為;它是 'JS中函式如何工作' 的一部分(是js的語法)。通常,如果你涉及一個方法,沒有 '()' 跟在方法名後面,例如:onClick={this.handleClick},你應該繫結這個方法。
如果呼叫 'bind' 使你苦惱,有2種方法可以繞過這個。如果你正在使用實驗性的 'property initializer syntax-屬性初始化語法',你可以使用屬性初始化來正確的繫結回撥:
		class LoggingButton extengs React.Component {
		 	// This syntax ensures `this` is bound within handleClick.
			// Warning: this is *experimental* syntax.
			handleClick = () => {
			    console.log('this is:', this);
			}	
			render() {
				return (
					<button onClick={this.handleClick}>
						Click me
					</button>
				);
			}
		}

使用 'Create React App' 方式建立專案(安裝方式的一種),這個解析是預設啟用的。
如果你沒有使用屬性初始化語法,你可以在回撥函式中,使用一個 '箭頭函式'(arrow function),例如:
		class LoggingButton extengs React.Component {
			handleClick = () => {
			    console.log('this is:', this);
			}	
			render() {
				// This syntax ensures `this` is bound within handleClick
				return (
					<button onClick={(e) => this.handleClick(e)}>
						Click me
					</button>
				);
			}
		}

這種語法的問題是:每次 'LoggingButton' 渲染,都會建立一個不同的回撥函式。在大多數情況下,是沒問題的。然而,如果這個回撥函式作為一個prop傳遞給低階元件(內部元件),這些元件,可能執行一次額外的重新渲染。我們一般推薦在構造器中繫結,避免這型別的效能問題。

相關推薦

React中文Handling Events

Handling Events - 事件處理React元素的事件處理同DOM元素的事件處理非常相似。有一些語法不同:1.React事件使用 'camelCase-駝峰式' 命名,而不是 'lowercase-小寫字母'2.使用JSX,傳遞一個函式作為事件處理,而不是字串例如

React中文Rendering Elements

Rendering Elements - 渲染元素元素是React應用的最小構建塊一個元素描述了你想要在螢幕上看到的內容: const element = <h1>Hello, world</h1>;不同於瀏覽器的DOM元素,React元素是普通物

React中文Forms

Forms - 表單在React中,HTML表單元素同其他DOM元素,有點不同。因為表單元素天生具備一些內部的state狀態。例如:下面的HTML表單接收一個名字: <form> Name: <input type="text" name="

Chromium Embedded Framework中文(基本使用)

視窗建立之前 (HandleBeforeCreated),客戶端可用之取消與定製瀏覽器視窗建立過程。視窗建立之後(HandleAfterCreated). 可用於建立自定義的CefJSHandler物件。位址列更新(HandleAddressChange). 將位址列更改為指定的字串,通知發生於導航提交後與頁

IdentityServer4系列中文及實際專案經驗分享

0、前言 原文:http://docs.identityserver.io/en/release/宣告: 1、目錄一至五章節根據IdentityServer英文文件翻譯而來,有些內容會根據自己的理解來表述的(包括標題),文件的內容會不斷的更新。 2、第六章節會進行闡述在實際專案中所用的內容以及問題 &

DL4J中文/開始/Eclipse DL4J示例

DL4J示例調研 DL4J的Github倉庫有很多示例可以涵蓋它的功能。快速入門向你展示瞭如何設定Intellij並克隆倉庫。本頁提供這些例子中的一些概述。 DataVec 示例 大多數示例都使用DataVec,這是一個通過歸一化,標準化,搜尋和替換,列洗牌和向量化  

React-Redux 中文

介紹 快速開始 React-Redux是Redux的官方React繫結庫。它能夠使你的React元件從Redux store中讀取資料,並且向store分發actions以更新資料 安裝 在你的React app中使用React-Redux: npm install

React官方Why React?

原文連結 譯者:羅澤軒 為什麼使用React? React作為創造使用者介面的JavaScript庫,在Facebook和Instagram中被廣泛使用。許多人視React為MVC中的V。React的誕生,就為解決一個問題:如何建立基於變化資料的大型應用。 簡單(Simple) 簡單地陳述

React官方Getting Started

原文連結  譯者:jella77 JSFiddle 開始React最簡單的方法就是遵循JSFiddle的Hello World例子: 入門包 如果你剛剛起步,你可以下載Starter Kit。Starter Kit包含為瀏覽器預製的React和React DOM,以及幫助你開始的示例。

React官方Forms

原文連結  譯者:黃文海 表單(Forms)  諸如<input>、<textarea>和 <option>的表單元件與其它原生(native)元件不同,因為它們可以通過使用者互動而被改變。這些元件提供的介面使得管理表單對使用者互動的響應更加容易。 有關

React官方教程Tutorial

原文連結 譯者:jella77 教程Tutorial  我們建立一個簡單但實際的評論框,Disqus, LiveFyre或Facebook可以提供實時評論,評論框可以放在一個部落格中。 我們提供: 可以看到所有評論的檢視 提交評論的表單 通過Hooks可以自定義後端 它有如下特點: 優

Keras:基於Theano和TensorFlow的深度學習庫中文

  本部落格主要給出某些必備的部分(一直更新中),詳細內容請移步至Github以及MoyanZitto的主頁。 第一部分:快速開始Keras   Keras的核心資料結構是“模型”,模型是一種組織網路層的方式。Keras中主要的模型是Sequ

程序中的沙盒以及plist的初步使用

ice b2c ng- 可見 ngs 函數 用戶 nsdata nss 沙盒是相對於“應用程序”的文件,也就是相相應app所在的頁面的文件。 每個應用都有自己的應用沙盒(應用沙盒就是文件系統文件夾)。與其它文件系統隔離。應用必須呆在在積極的沙盒中。其它的應用不可以訪問沙

React Native開發】React Native控ProgressBarAndroid進度條解說(12)

ice 發現 來講 top 文章 func dev all ios 轉載請標明出處:http://blog.csdn.net/developer_jiangqq/article/details/50596367本文出自:【江清清的博客】(一)前言 【好消息】

Linux用戶相關/etc/pssswd

理論 shel etc 開放 登錄 passwd 重復 login 由於 1.文件地址:   /etc/pssswd  -rw-r--r--. 1 root root 936 10月 6 12:50 /etc/passwd 2.文件內容:   xiaol_1:x:501

Linux用戶相關

linu 文件內容 刪除 應該 說明 信息 oot gid 通過 組信息文件:   1.文件地址:     /etc/group     -rw-r--r--. 1 root root 492 10月 6 21:56 /etc/group   2.文件內容:    

Nginx(五)-- 配置Rewrite

log 技術分享 判斷 placement ble png per 大小寫 遠程 Rewrite支持URL重寫 1.常用指令以及語法   1) if指令    if語法: if 空格 (condition) {}    條件:    1. &ld

ajax異步上傳data參數----小哈學js

style var 屬性 ada 數據 value lap sed $.ajax 下載ajaxFileUpload.js(下載網址:http://fileuploadajax.codeplex.com/downloads/get/20976) 修改ajaxFileUplo

Solr 配置schema.xml

standard 不同的 文檔 Coding 指向 hand 微軟 等價 core schema.xml這個配置文件的根本目的是為了通過配置告訴Solr怎樣建立索引。 solr的數據結構例如以下: document:一個文檔、一條記錄

Shell-3-

roo count 差集 class 表示 /dev/zero tex font 1.0 1.生成任意大小的文件 [[email protected]/* */ tmp]# dd if=/dev/zero of=junk.data bs=1M count=1