一、事件处理函数的使用

1.1 绑定事件处理函数

1.2 使用

<HelloWorld onClick={this.handleClick}/>

大括号中指定的是this对象即当前组件引用的点击事件处理函数。注意这里不需要圆括号(this.handleClick()),如果用圆括号,则是执行函数,并将函数返回作为圆括号的运行结果赋值给onClick属性。

如果我需要给事件处理函数传递参数怎么办?

1)因为使用圆括号传入参数,就会直接调用这个函数,并将返回值作为表达式结果,因此可以利用闭包实现。

class SignupForm extends React.Component{
constructor(props){
super(props);
     this.handleChange = this.handleChange.bind(this);
this.handleSelect = this.handleSelect.bind(this);
this.state = {
name:'',
password:'',
gender:'0'
};
}
handleChange(type){
var that=this;
return function(event){
var tempObj={};
tempObj[type]=
event.target.value;
that.setState(tempObj);
}
}

handleSelect(event){
this.setState({gender:event.target.value});
}
render(){
console.log(this.state);
return (
<div>
<label>name:
<input type="text" onChange={this.handleChange('name')}/>
</label><br/><br/>
<label>password:
<input type="password" onChange={this.handleChange('password')}/>
</label><br/><br/>
</div>
)
}
}
ReactDOM.render(<SignupForm/>,document.body);

2)利用bind函数的特性,传入第一个参数是作用域,第二个参数就是默认参数了

class SignupForm extends React.Component{
constructor(props){
super(props);
this.state = {
name:'',
password:'',
gender:'0'
}
}
handleChange(type,event){
var tempObj={};
tempObj[type]=event.target.value;
this.setState(tempObj);
}
handleSelect(event){
this.setState({gender:event.target.value});
}
render(){
console.log(this.state);
return (
<div>
<label>name:
<input type="text" onChange={this.handleChange.bind(this,'name')}/>
</label><br/><br/>
<label>password:
<input type="password" onChange={this.handleChange.bind(this,'password')}/>
</label><br/><br/>
</div>
)
}
}
ReactDOM.render(<SignupForm/>,document.body);

使用箭头函数

// 不需要传入参数时
class APP extends React.Component{
render(){
return <List onClick={this.handleClick}/>
}
} // List组件点击事件时执行了this.props.onClick没有参数
// 说明传给他的函数不接受参数
class List extends React.Component{
render(){
return <p id="para" onClick={this.props.onClick}>abc</p>
}
} // 传入参数
class APP extends React.Component{
render(){
return <List onClick={index => this.handleClick(index)} />
}
} // 利用箭头函数特性
// List组件点击时调用传入的函数this.props.onClick,这个函数有入参
// 因此props的onClick函数有入参,即APP中的onClick函数必须有入参
class List extends React.Component{
render(){
return <p id="para" onClick={(e) => this.props.onClick(id)}>abc</p>
}
} // 或者使用闭包
class List extends React.Component{
handleClick(id){
var that=this;
return function(){
that.props.onClick(id);
}
}
render(){
return <p id="para" onClick={this.handleClick(id)}>abc</p>
}
} // 或者
class List extends React.Component{
handleClick(id){
return function(){
this.props.onClick(id);
}
}
render(){
return <p id="para" onClick={this.handleClick(id).bind(this)}>abc</p>
}
} // 因为子组件执行this.props.func时其实是在执行父组件的引用
class APP extends React.Component{
constructors(props){
super(props);
this.handleClick=this.handleClick.bind(this);
}
handleClick(id){
// do something...
}
render(){
return <List onClick={this.handleClick}/>
}
}
// 这里传给List组件的onClick其实就是this.handleClick
// 因此List获得的this.props.onClick就是this.handleClick
// 所以不需要再写参数

二、组件之间的协同

2.1 父子嵌套

父组件向子组件传递消息使用属性传递,子组件向父组件传递消息就要使用委托。

<script type="text/babel">
class GenderSelect extends React.Component{
render(){
return <select onChange={this.props.handleSelect}> // 子组件触发父组件的函数,使得父组件的事件函数调用
<option value="0">男</option>
<option value="1">女</option>
</select>
}
}
class SignupForm extends React.Component{
constructor(props){
super(props);
this.state = {
name:'',
password:'',
gender:'0'
};
this.handleChange = this.handleChange.bind(this);
this.handleSelect = this.handleSelect.bind(this);
}
handleChange(type){
var that=this;
return function(event){
var tempObj={};
tempObj[type]=event.target.value;
that.setState(tempObj);
}
}
handleSelect(event){
this.setState({gender:event.target.value});
}
render(){
console.log(this.state);
return (
<div>
<label>name:
<input type="text" onChange={this.handleChange('name')}/>
</label><br/><br/>
<label>password:
<input type="password" onChange={this.handleChange('password')}/>
</label><br/><br/>
<label>gender:
<GenderSelect handleSelect={this.handleSelect}/> // 父组件利用属性传递给子组件事件名称
</label>
</div>
)
}
}
ReactDOM.render(<SignupForm/>,document.body);
</script>

2.2 使用Mixin

将组件的一些共同处理部分提取出来,在组件中通过mixins传入Mixin

<script type="text/babel">
var BindingMixin={ // Mixin 抽取出来的部分
handleChange:function(type,event){
var tempObj={};
tempObj[type]=event.target.value;
this.setState(tempObj);
}
};
var Comment=React.createClass({
mixins:[BindingMixin], // 传入数组
getInitialState:function(){
return {
text:'enter',
comment:'something',
selectText:'male'
}
},
render:function(){
return (
<div>
<input type="text" value={this.state.text} onChange={this.handleChange.bind(this,"text")}/>
<p>the input is {this.state.text}</p>
<textarea value={this.state.comment} onChange={this.handleChange.bind(this,"comment")}></textarea>
<p>the textarea is {this.state.comment}</p>
<select onChange={this.handleChange.bind(this,"selectText")}>
<option value="male">男</option>
<option value="female">女</option>
</select>
<p>the select is {this.state.selectText}</p>
</div>
)
}
});
ReactDOM.render(<Comment/>,document.getElementById("example"));
</script>

三、事件处理函数复用

3.1 bind复用

详见1.2

3.2 name复用

class SignupForm extends React.Component{
constructor(props){
super(props);
this.state = {
name:'',
password:'',
gender:'0'
};
this.handleChange = this.handleChange.bind(this);
this.handleSelect = this.handleSelect.bind(this);
}
   // 给组件添加name属性,利用event.target.name属性来判断不同的组件,从而达到复用的目的
handleChange(event){
var tempObj={};
tempObj[event.target.name]=event.target.name=="checkbox"?event.target.checked:event.target.value; // checkbox读取的是checked属性,input读取的是value
this.setState(tempObj);
}
handleSelect(event){
this.setState({gender:event.target.value});
}
render(){
console.log(this.state);
return (
<div>
<label>name:
<input type="text" name="text" onChange={this.handleChange}/>
</label><br/><br/>
<label>password:
<input type="password" name="password" onChange={this.handleChange}/>
</label><br/><br/>
</div>
)
}
}
ReactDOM.render(<SignupForm/>,document.body);

React事件用法的更多相关文章

  1. React Router 用法

    React Router 用法 一.DEMO import React from "react"; import { HashRouter as Router, Route, Li ...

  2. jQuery 事件用法详解

    jQuery 事件用法详解 目录 简介 实现原理 事件操作 绑定事件 解除事件 触发事件 事件委托 事件操作进阶 阻止默认事件 阻止事件传播 阻止事件向后执行 命名空间 自定义事件 事件队列 jque ...

  3. jQuery event,冒泡,默认事件用法

    jQuery event,冒泡,默认事件用法 <%@ page language="java" import="java.util.*" pageEnco ...

  4. React事件杂记及源码分析

    前提 最近通过阅读React官方文档的事件模块,发现了其主要提到了以下三个点  调用方法时需要手动绑定this  React事件是一种合成事件SyntheticEvent,什么是合成事件?  事件属性 ...

  5. react事件机制

    1. react的事件是合成事件((Synethic event),不是原生事件 <button onClick={this.handleClick}></button> &l ...

  6. repeater的command事件用法

    当Repeater里面循环控件时就会用到command, 是Repeater控件的原生事件用法 Repeater里面如果循环控件,控件的ID是会被改变的 repeater.itemcommand+= ...

  7. jquery get ($.get) 事件用法与分析

    jquery get ($.get) 事件用法与分析 get() 方法通过远程 HTTP GET 请求载入信息.这是一个简单的 GET 请求功能以取代复杂 $.ajax .请求成功时可调用回调函数.如 ...

  8. react基础用法二(组件渲染)

    react基础用法二(组件渲染) 如图所示组件可以是函数 格式:function 方法名(){ return <标签>内容</标签>} 渲染格式: <方法名 />  ...

  9. react基础用法一(在标签中渲染元素)

    react基础用法一(渲染元素) 如图所示最简单的变量使用方法 格式 let 变量名称 = 赋值: 渲染格式直接用 {变量名称} 就可以直接渲染到页面 如图所示第二种渲染方法 格式 const 变量名 ...

随机推荐

  1. Zookeeper 扫盲

    Zookeeper 扫盲 :disappointed_relieved: 配置文件详解: tickTime:基本事件单元,以毫秒为单位,这个时间作为 Zookeeper 服务器之间或客户端之间维持心跳 ...

  2. mysql连接出现Unknown system variable 'tx_isolation'异常

    出现这个异常,是因为mysql-connector-java.jar的版本太低,数据库的版本太高,不匹配导致的. 因此将mysql-connector-java升级到最新版本就解决了问题. 最新的三个 ...

  3. 阿里毕玄:来测试下你的Java编程能力

    上篇整理了下后面准备更系统化写的Java编程进阶的思路,如果仅看里面的词,很多同学会觉得都懂,但我真心觉得没有多少人是真懂的,所以简单的想了一些题目,感兴趣的同学们可以来做做看,看看自己的Java编程 ...

  4. PHP配置环境中如何开启伪静态

    1.在httpd.conf中引入httpd-vhosts.conf 2.在httpd.conf中开启mod_rewrite.so 3.在httpd-vhosts.conf中配置虚拟主机 AllowOv ...

  5. 利用CSS使footer固定在页面底部

    1.HTML基本结构 <!DOCTYPEhtml> <htmlxmlns="http://www.w3.org/1999/xhtml"> <headr ...

  6. mysql5.7以上版本安装

    首先下载mysql5.7zip版本 https://dev.mysql.com/downloads/mysql/5.7.html#downloads 然后放在本地解压 下载5.6版本 https:// ...

  7. golang之下载安装配置

    1.下载:根据操作系统和计算架构选择合适的安装包,操作系统类型有linux.mac.windows等,计算架构分为32位的386计算架构和64位的amd64计算架构 2.安装:推荐安装到 /usr/l ...

  8. Wireshark抓包常见问题解析(转)

    1. tcp out-of-order(tcp有问题) 解答: 1). 应该有很多原因.但是多半是网络拥塞,导致顺序包抵达时间不同,延时太长,或者包丢失,需要重新组合数据单元 因为他们可能是通过不同的 ...

  9. 【JZOJ4810】【NOIP2016提高A组五校联考1】道路规划

    题目描述 输入 输出 样例输入 5 1 4 5 2 3 3 4 2 1 5 样例输出 3 数据范围 样例解释 解法 模型显然. 设第一列为a[],第二列为b[],f[i]为前i个数的最大答案. 顺序枚 ...

  10. Docker Remote API使用准备

    1 修改配置文件 CentOS: /etc/sysconfig/docker Ubuntu: /etc/init/docker.conf 1.添加: DOCKER_OPTS='-H tcp://0.0 ...