在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中类组件中关于回调函数的一个问题的更多相关文章

  1. 理解和使用 JavaScript 中的回调函数

    理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报  分类: JavaScript(4)    目录( ...

  2. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  3. JavaScript 中的回调函数

    原文:http://javascriptissexy.com/ 翻译:http://blog.csdn.net/luoweifu/article/details/41466537 [建议阅读原文,以下 ...

  4. react 在 componentWillMount() 中调用异步函数时,componentWillMount() finishes after render()

    刚开始使用 react,很多属性.方法不是很熟.在此记录下我所遇到的问题及解决方法. 我在 componentWillMount() 中调用了一个异步函数,在返回结果中调用 this.setState ...

  5. PHP中的回调函数和匿名函数

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  6. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

  7. [转]理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

  8. 【JavaScript】理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

  9. C中的回调函数

    C语言中应用回调函数的地方非常多,如Nginx中: struct ngx_command_s { ngx_str_t name; ngx_uint_t type; char *(*set)(ngx_c ...

  10. Java中的回调函数学习

    Java中的回调函数学习 博客分类: J2SE JavaJ#  一般来说分为以下几步: 声明回调函数的统一接口interface A,包含方法callback(); 在调用类caller内将该接口设置 ...

随机推荐

  1. Week09_day05(Hbase的基本使用)

    使用HBase 和 Hbase使用帮助 1).进入HBase  #使用命令进入HBase Shell $ hbase shell The HBase shell is the (J)Ruby IRB ...

  2. 【忍者算法】从快慢指针到倒数查找:优雅解决链表倒数问题|LeetCode第19题"删除链表的倒数第N个结点"

    从快慢指针到倒数查找:优雅解决链表倒数问题 从生活场景说起 想象你在一个漫长的队伍中,想知道自己距离队尾还有多少人.一个巧妙的方法是:让你的朋友从你所在位置往后数N步,然后你和朋友一起向后走.当朋友走 ...

  3. springboot项目发布war包

    1:修改pom.xml 将"jar"改为"war" <packaging>war</packaging> 将: <dependen ...

  4. Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录

    Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录 比赛连接 手速场,上蓝场,但是有点唐,C 想错了写了半个多小时,想到正解不到 \(10 ...

  5. Vue3路由进阶实战:深度解析参数传递与导航守卫核心技术

    一.路由参数传递的进阶应用技巧 1.1 路由配置与参数验证 // router/index.js { path: '/user/:userId(\\d+)', // 使用正则表达式限制只匹配数字 na ...

  6. C# async/await使用举例

    1.async/await几点总结 a.被async标记的方法,返回值类型只能为void.Task.Task<T>. b.被async标记的方法,内部可以有await修饰符,表明内部逻辑某 ...

  7. 一次客户演讲PPT 反思

    一 演讲ppt正常 制作流程: 编写演讲纲 与客户确认 确认通过后编写演讲稿 制作PPT 二 过程反思点 写纲前 与客户对接,了解需求及想法,最好音频记录 任务紧张程度.重要性想办法理清楚(领导跟踪情 ...

  8. SQL注入之WAF绕过注入

    绕过WAF: WAF防御原理: 简单来说waf就是解析http请求,检测http请求中的参数是否存在恶意的攻击行为,如果请求中的参数和waf中的规则库所匹配,那么waf则判断此条请求为攻击行为并进行阻 ...

  9. Oracle VM VirtualBox虚拟机安装Centos

    virtualBOx 6.x.x版本跟 virtualBOx 5.x.x 界面已经不一样,但安装步骤还是一样的 镜像下载可以使用下面帖子中的,网易镜像或者阿里云镜像,选取适合自己的镜像 开源镜像站,v ...

  10. pandas -- 处理非数值型数据 -- 数据分析三剑客(核心)

    博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...