#React中类组件中关于回调函数的一个问题
在ES6中,类中定义的方法,是放在原型对象的,供实例对象引用。
//创建一个Person类
class Person {
constructor(name,age) {
this.name = name;
this.age = age;
}
}
class Student extends Person {
constructor(name,age,grade) {
super(name,age);
this.grade = grade;
}
study() {
console.log(this);
}
}
const st = new Student("john", 12, 'sdfjk');
st.study();
const x = st.study;
x();

所以,在st调用study方法时候,输出的是该实例对象,而将st.study方法赋值给x时,再调用x,那么类中定义的方法都是局部严格模式,所以该方法中的this就是undefined。
而将代码改为:
const st = new Student("john", 12, 'sdfjk');
st.study();
const x = st.study.bind({name:'Tom',age:18});
x();
此时,x中的this就是对象{name:"Tom",age:18}了,输出如下:

下面上jsx代码:
class Weather extends React.Component{
constructor(props){
super(props);
this.state={isHot:false};
}
render(){
return <h1 onClick={this.changeWheather}>今天天气很炎热</h1>
}
changeWheather(){
console.log(this);
}
}
ReactDOM.render(<Weather/>,document.getElementById("test"));

点击,发现changeWheather打印的是undefined。
是因为changeWheather是作为onCick的回调,而部是通过实例调用的,是直接调用类中的方法,默认开启了局部的严格模式,当点击时,调用changeWheather方法,而该方法并不是实例调用的,开启严格模式,所以this就是undefined,所以打印的是undefined。
而改正的方法,就是通过bind,将类中定义的changeWheather方法中的this改为实例对象。
class Weather extends React.Component{
constructor(props){
super(props);
this.state={isHot:false};
this.test=this.nice.bind(this);
}
render(){
return <h1 onClick={this.test}>今天天气很炎热</h1>
}
nice(){
console.log(this);
}
}
ReactDOM.render(<Weather/>,document.getElementById("test"));

上述修改,当点击时,触发test方法,虽然同样也不是实例对象调用的,但test方法中的this就是实例对象,因为在constructor构造器中,已经通过bind,将nice方法中的this变成了实例对象,所以,输出的是实例对象
上述修改只是为了,更明显的说明,实际上可以:
class Weather extends React.Component{
constructor(props){
super(props);
this.state={isHot:false};
this.changeWheather=this.changeWheather.bind(this);
}
render(){
return <h1 onClick={this.changeWheather}>今天天气很炎热</h1>
}
changeWheather(){
console.log(this);
}
}
ReactDOM.render(<Weather/>,document.getElementById("test"));
可以看到,实例中也有一个changeWheather方法,这里,在赋值给回调函数时候,首先发现了实例的changeWheateher,所以就不会调用原型对象上的changeWheather方法。
精简写法
class Weather extends React.Component{
//可以去掉构造器
//直接用赋值语句,给实例增加属性。
state={isHot:false};
render(){
const isHot=this.state.isHot;
return <h1 onClick={this.changeWheather}>今天天气很{isHot?"炎热":"凉爽"}</h1>
}
//自定义方法,要用赋值语句的形式+箭头函数,箭头函数中的this,就会往外寻找this,而由于是赋值语句
//所以该属性是放在实例上的,而又因为是箭头函数,所以this,外寻,找到了实例,所以,此处里面的this就是实例。
changeWheather=()=>{
const isHot=this.state.isHot;
this.setState({isHot:!isHot});
}
}
ReactDOM.render(<Weather/>,document.getElementById("test"));
关于类中赋值语句+箭头函数的this指向的测试如下:

#React中类组件中关于回调函数的一个问题的更多相关文章
- 理解和使用 JavaScript 中的回调函数
理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报 分类: JavaScript(4) 目录( ...
- 理解javascript中的回调函数(callback)【转】
在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...
- JavaScript 中的回调函数
原文:http://javascriptissexy.com/ 翻译:http://blog.csdn.net/luoweifu/article/details/41466537 [建议阅读原文,以下 ...
- react 在 componentWillMount() 中调用异步函数时,componentWillMount() finishes after render()
刚开始使用 react,很多属性.方法不是很熟.在此记录下我所遇到的问题及解决方法. 我在 componentWillMount() 中调用了一个异步函数,在返回结果中调用 this.setState ...
- PHP中的回调函数和匿名函数
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- js中的回调函数的理解和使用方法
js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...
- [转]理解与使用Javascript中的回调函数
在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
- 【JavaScript】理解与使用Javascript中的回调函数
在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
- C中的回调函数
C语言中应用回调函数的地方非常多,如Nginx中: struct ngx_command_s { ngx_str_t name; ngx_uint_t type; char *(*set)(ngx_c ...
- Java中的回调函数学习
Java中的回调函数学习 博客分类: J2SE JavaJ# 一般来说分为以下几步: 声明回调函数的统一接口interface A,包含方法callback(); 在调用类caller内将该接口设置 ...
随机推荐
- 『玩转Streamlit』--缓存机制
Streamlit 应用在运行时,每次用户交互都会触发整个脚本的重新执行. 这意味着一些耗时操作,如数据加载.复杂计算和模型训练等,可能会被重复执行,严重影响应用响应速度. 本文介绍的缓存机制能够帮助 ...
- 【渗透测试】Vulnhub DarkHole
渗透环境 攻击机: IP: 192.168.216.129(Kali) 靶机: IP:192.168.216.130 靶机下载地址:https://www.vulnhub.com/entr ...
- Week08_day07(DataX从mysql上读取数据传输到HDFS上)
简介DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.HDFS.Hive.OceanBase.HBase.OTS.ODPS 等各种异构数据源之间高效的 ...
- php获取类名
<?php class ParentClass { public static function getClassName() { return __CLASS__; } } class Chi ...
- 是否有必要使用 Oracle 向量数据库?
向量数据库最主要的特点是让传统的只能基于具体值/关键字的数据检索,进化到了可以直接基于语义的数据检索.这在AI时代至关重要! 回到标题问题:是否有必要使用 Oracle 向量数据库? 这实际还要取决于 ...
- SpringSecurity学习笔记-前后端分离
1. 简介 Spring Security是Spring家族中的一个安全管理框架.相比于另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富. 一般来说中大型的项目都是使用Sp ...
- GBJ 97-1987 水泥混凝土路面施工及验收规范(电子版)PDF 版本 下载
本规范适用于新建和改建的公路 城市道路 厂矿道路和民航机场道面等就地浇筑的水泥混凝土路面的施工及验收 链接:https://pan.baidu.com/s/17t88jnEU6IrptmEWsyuN3 ...
- 分析 AIX 和 Linux 性能的免费工具。
一.软件介绍1.分析工具nmon 工具可以帮助在一个屏幕上显示所有重要的性能优化信息,并动态地对其进行更新.这个高效的工具可以工作于任何哑屏幕.telnet 会话.甚至拨号线路.另外,它并不会消耗大量 ...
- SLAM在机器人中的应用
SLAM在机器人中的应用 伴随着人工智能.机器人.无人驾驶等技术的蓬勃发展,越来越多的相关智能产品出现在了我们的日常生活中,作为底层技术基石之一的SLAM也逐渐被大家所熟知.下面通过"机器 ...
- 【开源推荐】AI Interviewer:基于Spring-Alibaba-AI的智能面试官系统(附GitHub实战教程)
项目背景 作为开发者,你是否经历过: 技术面试时因紧张发挥失常? 刷了1000+LeetCode却不会表达解题思路? 花费上千元购买模拟面试服务? 今天推荐的AI Interviewer开源项目,正是 ...
