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. Shadow安装

    1.Shadow插件的安装 http://shadow.github.io/ 这是shadow主页的网址,Shadow是一个开源的网络模拟器/仿真器,我们用它模拟Tor网络的运行状况.   1.1安装 ...

  2. ARTS-2

    ARTS的初衷 Algorithm:主要是为了编程训练和学习.每周至少做一个 leetcode 的算法题(先从Easy开始,然后再Medium,最后才Hard).进行编程训练,如果不训练你看再多的算法 ...

  3. 【Linux开发】IO streaming DMA buffer importing

    http://linuxtv.org/downloads/v4l-dvb-apis/dmabuf.html I/O流 (DMA缓存引用) 这是一个实验性接口,将来可能发生改变 DMABUF框架提供了在 ...

  4. python+selenium下弹窗alter对象处理01

    alt.accept() :                            等同于单击“确认”或者“OK” alt.dismiss() :                            ...

  5. 红帽学习笔记[RHCSA] 第二课[文件、目录、相关命令]

    第二课 常用的目录结构与用途 / 根目录 /boot 存储的是系统起动时的信息和内核等 /dev 存储的是设备文件 /etc 存储的是系统的配置文件 /root 存储的是root用户的家目录 /hom ...

  6. 基于opencv简单的图片截取

    import xml.etree.ElementTree as ET import os, cv2 from tqdm import tqdm annota_dir = 'C:\\Users\\Adm ...

  7. P1219八皇后

    这个题是一道USACO的经典dfs,与我见面的时间起码七个月了. 放置n个皇后于n*n棋盘,他们不能互相吃(行,列,对角线),问有几种摆法?于是想到了dfs(自我认为有图的就不用DP).首先确定好了要 ...

  8. 断开ssh链接在后台继续运行命令

    转载:http://blog.csdn.net/v1v1wang/article/details/6855552 对于linux运维,我们都是使用ssh登录到服务器,如果我们运行的任务需要很长时间或不 ...

  9. python day1-requests

    一.什么是requests Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库. 相对于urllib库(自带,无需手动安装)而言, ...

  10. xilinx基础入门

    2019.09.03 一.基础部分及语法 一.FPGA程序的固化 [USF-XSim-62] 'simulate' step failed with errors. Please check the ...