React事件用法
一、事件处理函数的使用
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事件用法的更多相关文章
- React Router 用法
React Router 用法 一.DEMO import React from "react"; import { HashRouter as Router, Route, Li ...
- jQuery 事件用法详解
jQuery 事件用法详解 目录 简介 实现原理 事件操作 绑定事件 解除事件 触发事件 事件委托 事件操作进阶 阻止默认事件 阻止事件传播 阻止事件向后执行 命名空间 自定义事件 事件队列 jque ...
- jQuery event,冒泡,默认事件用法
jQuery event,冒泡,默认事件用法 <%@ page language="java" import="java.util.*" pageEnco ...
- React事件杂记及源码分析
前提 最近通过阅读React官方文档的事件模块,发现了其主要提到了以下三个点 调用方法时需要手动绑定this React事件是一种合成事件SyntheticEvent,什么是合成事件? 事件属性 ...
- react事件机制
1. react的事件是合成事件((Synethic event),不是原生事件 <button onClick={this.handleClick}></button> &l ...
- repeater的command事件用法
当Repeater里面循环控件时就会用到command, 是Repeater控件的原生事件用法 Repeater里面如果循环控件,控件的ID是会被改变的 repeater.itemcommand+= ...
- jquery get ($.get) 事件用法与分析
jquery get ($.get) 事件用法与分析 get() 方法通过远程 HTTP GET 请求载入信息.这是一个简单的 GET 请求功能以取代复杂 $.ajax .请求成功时可调用回调函数.如 ...
- react基础用法二(组件渲染)
react基础用法二(组件渲染) 如图所示组件可以是函数 格式:function 方法名(){ return <标签>内容</标签>} 渲染格式: <方法名 /> ...
- react基础用法一(在标签中渲染元素)
react基础用法一(渲染元素) 如图所示最简单的变量使用方法 格式 let 变量名称 = 赋值: 渲染格式直接用 {变量名称} 就可以直接渲染到页面 如图所示第二种渲染方法 格式 const 变量名 ...
随机推荐
- python 数据标准化
- NKOJ3485 【2015多校联训4】数据
问题描述 Mr_H 出了一道信息学竞赛题,就是给 n 个数排序.输入格式是这样的:试题有若干组数据.每组数据的第一个是一个整数 n,表示总共有 n 个数待排序:接下来 n 个整数,分别表示这n 个待排 ...
- API安全验证之JWT(JSON WEB TOKEN) OLCMS
假如www.olcms.com/getUserInfo获取用户信息,你怎么知道当前用户是谁?有人说登陆时候我把他UID写入session了,如果是API接口,没有session怎么办,那么就需要把UI ...
- LintCode_133 最长单词
题目 给一个词典,找出其中所有最长的单词. 样例 在词典 { "dog", "google", "facebook", "inte ...
- pycharm多行批量缩进和反向缩进快捷键
在 VS, PYCHARM 中只要 拉选块之后,按下tab键,整个块就会缩进 按下 shift + tab 就会反向缩进
- 在Eclipse打开文件目录
1.在Eclipse中使用外部命令 2.配置外部命令 3.设置使用的命令和参数 4.设置使用notepad++打开文件
- 【祈福】NOIP战后占卜:众星陨落,天命难违
Day1 加上看题,做完第一题之后我已经只剩两个小时半了. 然后凭着一定要做完第一题和第二题的坚定信念. 我耗到了只剩一个小时半,结果正解还是没想出来. 其实我从只剩两小时的时候,就有了打第二题的暴力 ...
- 网络流24题 餐巾计划(DCOJ8008)
题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_iri 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 P PP 分:或者把旧餐巾送到快 ...
- phpmyadmin误删表后的恢复过程
转自:http://blog.csdn.net/ssrc0604hx/article/details/18717983 话说今天不知道是抽风了还是失魂了,在用phpmyadmin删除测试数据时,竟然将 ...
- 1.Golang开山篇,GO就是NB!
目录:GO就是NB GO sb吗 安装环境 GO就是NB,K2R三位大佬写的GO,学GO不吃亏! (1)我们为什么要学 高并发 深度 || 广度 (2)go学习思路和目标 多打多练 掌握go语言 做一 ...