一、事件处理函数的使用

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. python 随机模块random

  2. 词袋和 TF-IDF 模型

    做文本分类等问题的时,需要从大量语料中提取特征,并将这些文本特征变换为数值特征.常用的有词袋模型和TF-IDF 模型 1.词袋模型 词袋模型是最原始的一类特征集,忽略掉了文本的语法和语序,用一组无序的 ...

  3. 微信小程序--Tab栏切换的快速实现

    上效果! wxss样式代码: .tabs-item.selected { color:rgba(,,,.); border-bottom:2px solid rgba(,,,.); } .tabs-i ...

  4. web前端学习(三)css学习笔记部分(10)-- 初级开发工程师面试题

    html所有基础.h5的所有基础.CSS所有常用的布局.CSS3新增的属性等等内容 附一个课程上用到的链接(转载): http://www.zhufengpeixun.cn/JavaScriptmia ...

  5. [新手必看] 17个常见的Python运行时错误

    对于刚入门的Pythoner在学习过程中运行代码是或多或少会遇到一些错误,刚开始可能看起来比较费劲.随着代码量的积累,熟能生巧当遇到一些运行时错误时能够很快的定位问题原题.下面整理了常见的17个错误, ...

  6. jq处理JSON数据, jq Manual (development version)

    jq 允许你直接在命令行下对 JSON 进行操作,包括分片.过滤.转换等等.让我们通过几个例子来说明 jq 的功能:一.输出格式化,漂亮的打印效果如果我们用文本编辑器打开 JSON,有时候可能看起来会 ...

  7. Spring+Stomp+ActiveMq实现websocket长连接

    stomp.js+spring+sockjs+activemq实现websocket长连接,使用java配置. pom.xml(只列出除了spring基本依赖意外的依赖,spring-version为 ...

  8. 【OI】拓扑排序

    拓扑排序 首先要求图为DAG 算法:首先将度为1的节点加入队列每次取出队首点u,在图中删去和u相邻的边继续将度数为1的点加入队列 到了最后, 如果没有度数为1的点,则图不是DAG 通过拓扑排序可以给D ...

  9. Directx11教程(67) 显示模型文件

    原文:Directx11教程(67) 显示模型文件       在前面的教程中,我们都是通过在ModelClass中直接产生顶点和索引数据,简单的三角形,立方体等等还好说,毕竟比较简单,如何显示复杂的 ...

  10. DFS-生日蛋糕

    生日蛋糕 一道深搜题,看了这两个博客才懂的. http://blog.csdn.net/blesslzh0108/article/details/53486168 http://blog.csdn.n ...