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之路21】用户登陆程序函数
一.用户登陆函数实例 1.注意:以后写函数时必须在函数第一行后按回车加入“”““”“””两对三引号后回车,此时会自动列出参数值,注释函数的作用.参数的用法和返回值 #!usr/bin/env pyth ...
- Hdu 4251 区间中位数(划分树)
题目链接 The Famous ICPC Team Again Time Limit: 30000/15000 MS (Java/Others) Memory Limit: 32768/3276 ...
- 阿里云CDN边缘脚本EdgeScript公测:简单语法完成CDN复杂配置
CDN可以将源站内容分发至最靠近用户侧的节点,使得用户就近获取内容,提高用户的访问成功率和效率.作为CDN运维工程师,他的日常工作就是通过CDN系统的配置和管理,来确保CDN业务正常运转,以此来保障网 ...
- JavaCollection
http://blog.csdn.net/itlwc/article/details/10148321 http://blog.sina.com.cn/s/blog_6d6f5d7d0100s9nu. ...
- python的解释器类型
Python解释器 当我们编写Python代码时,我们得到的是一个包含Python代码的以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件. 由于整个Python语言从规 ...
- python KMP算法介绍
- Effective Modern C++:02auto
05:优先使用auto,而非显示类型声明 显示类型声明有下面一些缺点: int x; //未初始化,或者初始化为0,视语境而定 template<typename It> void dwi ...
- TensorFlow3学习笔记1
1.简单实例:向量相加 下面我们通过两个向量相加的简单例子来看一下Tensorflow的基本用法. [1. 1. 1. 1.] + [2. 2. 2. 2.] = [3. 3. 3. 3.] impo ...
- 【JZOJ4848】【GDOI2017模拟11.3】永恒的契约
题目描述 宅邸迅速的燃烧着,必须带贝蒂走出禁书库!凭着感觉,又一次直接找到禁书库的门. "你,是那个人嘛?"400年了,当初圣域建立结界时没有进入圣域,被伤了心的人工精灵贝蒂,与强 ...
- thinkphp5.0验证码使用
如果没有安装验证码类,可在composer.json 文件的require里面添加 "topthink/think-captcha":"1.*",然后compo ...