1、事件处理中的this指针问题

在 react 中,用 class 声明一个组件,调用 class 中的方法时,如果该方法中有 this 且没有手动绑定 this 指针,则会发生 this 指向 undefined 的问题。

class LoggingButton extends React.Component {
constructor(props) {
super(props);
this.state = {isToggleOn: true}
}
handleClick() {
this.setState(prevState => ({ //报错,this 指向 undefined,没有setState方法
isToggleOn: !prevState.isToggleOn
}));
} render() {
return (
<button onClick={this.handleClick}>
Click me
</button>
);
}
}

1.1、如何手动绑定方法中的 this 指针

1.1.1、在构造函数中用 bind 绑定 this

constructor(props) {
//下面手动绑定了handleClick方法的this指针
this.handleClick = this.handleClick.bind(this);
}

1.1.2、在调用时用 bind 绑定 this

class Test extends React.Component {
constructor (props) {
super(props)
this.state = {message: 'Allo!'}
} handleClick (name, e) {
console.log(this.state.message + name)
} render () {
return (
<div>
//下面在调用时绑定了this指针,并进行了传参
<button onClick={ this.handleClick.bind(this, '赵四') }>Say Hello</button>
</div>
)
}
}

1.1.3、用箭头函数声明函数

class Home extends React.Component {
constructor(props) {
super(props);
this.state = { isToggleOn: true };
} //用箭头函数声明可以绑定this
handleClick = () => {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn
}));
} render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}
}

1.1.4、用箭头函数调用class中的函数

render() {
return (
//用箭头函数来调用
<button onClick={(e) => {this.handleClick(params, e)} }>
{this.state.isToggleOn ? 'ON' : 'OFF'}
</button>
);
}

使用这个语法有个问题就是每次在组件渲染的时候都会创建一个不同的回调函数,如果这个回调函数作为一个属性值传入其它组件,这些组件可能会进行额外的重新渲染。我们通常建议在构造函数中绑定或使用箭头函数声明函数的方式来避免这类性能问题。

1.1.5、使用React.createClass

React 15及以下的版本可以React.createClass函数来创建一个组件。你在里面创建的所有函数的this将会自动绑定到组件上。

const App = React.createClass({
handleClick() {
console.log('this', this); // this 指向App组件本身
},
render() {
return (
<div onClick={this.handleClick}>test</div>
);
}
});

但是需要注意随着React 16版本的发布官方已经将改方法从React中移除

1.2、为什么要手动绑定 this

还是有点模糊,给出一些参考链接

参考:http://www.fly63.com/article/detial/1013https://www.cnblogs.com/dashnowords/p/9343383.html

React使用的思考总结的更多相关文章

  1. react的一些思考

    在做好第一个需求之后,我接到了一个react写的产品,这让我异常的兴奋,终于能写react了 开始做的时候整体框架已经搭建好了,这让我有点小失落,我还以为我要开始搭框架了呢,没事,搭的也挺好的. 有了 ...

  2. Facebook的Web开发三板斧:React.js、Relay和GraphQL

    2015-02-26 孙镜涛  InfoQ Eric Florenzano最近在自己的博客上发表了一篇题为<Facebook教我们如何构建网站>的文章,他认为软件开发有些时候需要比较大的跨 ...

  3. 从省市区多重级联想到的,react和jquery的差别

    在我们的前端项目里经常会用到级联的select,比如省市区这样.通常这种级联大多是动态的.比如先加载了省,点击省加载市,点击市加载区.然后数据通常ajax返回.如果没有数据则说明到了叶子节点.   针 ...

  4. React官方中文文档【安装】

    https://reactjs.org/docs/getting-started.html  //React官方文档地址 1.入门 此页面是React文档和相关资源的概述. React是一个用于构建用 ...

  5. 草珊瑚的redux使用方式

    前言 阮大师写入门教程能力一流. 首推它的Redux三篇入门文章. http://www.ruanyifeng.com/blog/2016/09/redux_tutorial_part_one_bas ...

  6. 二刷Redux笔记

    关于react的一些思考 所有的数据全部先要发送给容器,然后容器负责接受数据单后再分发数据给他下面的组件,通过props来传递,一个页面就可以相当于一个容器,容器之中就会有很多子组件,一般组件只负责接 ...

  7. 超硬核 Web 前端学霸笔记,学完就去找工作!

    文章和教程 Vue 学习笔记 Node 学习笔记 React 学习笔记 Angular 学习笔记 RequireJS 学习笔记 Webpack 学习笔记 Gulp 学习笔记 Python 学习笔记 E ...

  8. React.js入门笔记(续):用React的方式来思考

    本文主要内容来自React官方文档中的"Thinking React"部分,总结算是又一篇笔记.主要介绍使用React开发组件的官方思路.代码内容经笔者改写为较熟悉的ES5语法. ...

  9. React中父组件与子组件之间的数据传递和标准化的思考

    React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...

随机推荐

  1. 20191127 Spring Boot官方文档学习(4.12)

    4.12.缓存(Caching) Spring框架提供了对应用程序透明添加缓存的支持.从本质上讲,抽象将缓存应用于方法,从而根据缓存中可用的信息减少执行次数.缓存逻辑是透明应用的,不会对调用者造成任何 ...

  2. 递归 dfs 记忆化搜索 动态规划

    今天做洛谷P1434 [SHOI2002]滑雪 的时候仔细想了想记忆化搜索 现在总结一下 为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态……这种用自已来 ...

  3. OracleOraDb11g_home1TNSListener服务无法启动

    作者:伪墨 来源:CSDN 原文:https://blog.csdn.net/qq997404392/article/details/73296429 今天遇到OracleOraDb11g_home1 ...

  4. IDEA 快捷键 (长期更新)

    自动清除无效 import 和 清除无效 import  ctrl+alt+o    

  5. E - 盒子游戏

    有两个相同的盒子,其中一个装了n个球,另一个装了一个球.Alice和Bob发明了一个游戏,规则如下:Alice和Bob轮流操作,Alice先操作每次操作时,游戏者先看看哪个盒子里的球的数目比较少,然后 ...

  6. mongodb启动报错,child process failed, exited with error number 1

    error: child process failed, exited with error number 1 第一次安装mongodb,随后启动一般不会出现上面的错误,出现这种错误的原因一般是mon ...

  7. div和span互换

    div是块级元素,它不论大小默认占一行,而且可以设置宽高以及外边距span是行内元素,它占它自身大小的位置,而且不能设置宽高以及边距同时div也可以变为span (display:inline),这样 ...

  8. axios 文件流下载

    this.axios .post(this.baseUrl+"/exportUser", { admin: "",keys: "",keyw ...

  9. iOS - 断言处理与调试

    一.Objective - C 中的断言: Objective - C 中的断言处理使用的是 NSAssertionHandler : 每个线程拥有它自己的断言处理器,它是 NSAssertionHa ...

  10. IDEA显示Run Dashboard窗口

    接下来在workspace.xml RunDashBoard节点中添加如下内容:<component name="RunDashboard"> 在代码中加入 <o ...