一、事件处理函数的使用

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. 洛谷P1569属牛的抗议 超级强力无敌弱化版

    P1569 [USACO11FEB]属牛的抗议Generic Cow Prote- 题目描述 约翰家的N头奶牛聚集在一起,排成一列,正在进行一项抗议活动.第i头奶牛的理智度 为Ai,Ai可能是负数.约 ...

  2. php分页查询的简单实现代码

    <body><h1>分页查询</h1><?phpinclude("DADB.class.php");$db=new DADB();$tj= ...

  3. 全面解析vue-cli生成的项目中使用其他库(js库、css库)

    前言:最近有小伙伴问我,是不是用vue脚手架生成的项目就不能jquery了呢?显然,答案是否定的,必须能用.但是个人建议最好不要用了,用人家vue提供的不好嘛. 一.用vue-cli生成项目 1. v ...

  4. html 遮罩层以及弹出框的制作

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. JavaScript--jquery.min.js文件

    /*! jQuery v1.12.3 | (c) jQuery Foundation | jquery.org/license */ !function(a,b){"object" ...

  6. 学习笔记(2)---Matlab 图像处理相关函数命令大全

    Matlab 图像处理相关函数命令大全 一.通用函数: colorbar  显示彩色条 语法:colorbar \ colorbar('vert') \ colorbar('horiz') \ col ...

  7. 移动端适配之二:visual viewport、layout viewport和ideal viewport介绍

    上一篇博文,可算把像素这个东西讲清楚了.在这篇博文里面,将继续介绍viewport相关的内容. 很多博客都会提到PPK所讲的三个viewport,有的讲的比较复杂,看的云里雾里,我这里也大概介绍一下, ...

  8. ACK容器服务虚拟节点使用阿里云日志服务来收集业务容器日志

    按照这篇博文的介绍,可以在ACK集群上通过Helm的方式部署虚拟节点,提升集群的弹性能力.现在,通过虚拟节点部署的ECI弹性容器实例也支持将stdout输出.日志文件同步到阿里云日志服务(SLS)进行 ...

  9. 洛谷1014 Cantor表

      水题.随便搞搞就过了. //Serene #include<algorithm> #include<iostream> #include<cstring> #i ...

  10. 【C++】位运算实现加减乘除

    #include<iostream> #include<assert.h> using namespace std; // 位运算实现加减乘除 int myAdd(int nu ...