React中,报错"Cannot read property 'setState' of undefined"时,如何处理
App.js
import React, { Component } from 'react'; import './App.css'; class App extends Component { constructor(props){ super(props); this.state = { num: 90 } }; handleClick(){ this.setState({ num: this.state.num + 1 }) }; render() { return ( <div className="App"> {this.state.num} <button onClick={this.handleClick}>点击</button> </div> ); } } export default App;
我们把num初始值通过构造函数constructor保存在this.state里,之后我们给button按钮一个点击事件handleClick,
然后通过点击button按钮来更新num的初始值,当我们点击的时候,毫无疑问报错了“Cannot read property 'setState' of undefined”,
翻译意思是:‘无法读取未定义的属性'setState'’,他的意思就是告诉我们,当我们点击的时候,并没有读取到setState中的值,也就是说:
handleClick方法中的this与组件中的this不一致,不是同一个this。
碰到这个问题有两种解决方法:这两种方法的目的就是要保证:handleClick方法中的this与组件中的this要保持一致,这样才能读取到setState中的值来改变num,
第一种方法:
import React, { Component } from 'react'; import './App.css'; class App extends Component { constructor(props){ super(props); this.state = { num: 90 } this.handleClick = this.handleClick.bind(this); //把组件中的this绑定到handleClick方法中,这样就会保持this一致 }; handleClick(){ this.setState({ num: this.state.num + 1 }) }; render() { return ( <div className="App"> {this.state.num} <button onClick={this.handleClick}>点击</button> <button onClick={this.handleClick.bind(this)}>点击</button> //把上面的写到这里也是可以的 </div> ); } } export default App;
第二中方法:
import React, { Component } from 'react'; import './App.css'; class App extends Component { constructor(props){ super(props); this.state = { num: 90 } }; handleClick(){ this.setState({ num: this.state.num + 1 }) }; handleClick = () => { //利用箭头函数 this.setState({ num: this.state.num + 1 }) }; render() { return ( <div className="App"> {this.state.num} <button onClick={this.handleClick}>点击</button> <button onClick={()=> {this.handleClick()}>点击</button>或 <button onClick={() => this.handleClick()}>点击</button> </div> ); } } export default App;
在 React 里面,要将类的原型方法通过 props 传给子组件,传统写法需要 bind(this),否则方法执行时 this 会找不到:
<button onClick={this.handleClick.bind(this)}></button>
或者
<button onClick={() => this.handleClick()}></button>
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SpringBoot应用篇之FactoryBean及代理实现SPI机制示例
更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 FactoryBean在Spring中算是一个比较有意思的存在了,虽然在日常的业务开发中,基本上不怎么会用到,但在某些场景下,如果用得好,却可以实现很多有意思的东西 本篇博文主要介绍如何通过FactoryBean来实现一个类SPI机制的微型应用框架 文章内涉及到的知识点 SPI机制 FactoryBean JDK动态代理 I. 相关知识点 在看下面的内容之前,得知道一下什么是SPI,以及SPI的用处和JDK实现SPI的方式,对于这一块有兴趣了解的童鞋,可以看一下个人之前写的相关文章 SPI相关技术博文汇总---By一灰灰Blog 1. demo背景说明 在开始之前,有必要了解一下,我们准备做的这个东西,到底适用于什么样的场景。 在电商中,有一个比较恰当的例子,商品详情页的展示。拿淘宝系的详情页作为背景来说明(没有在阿里工作过,下面的东西纯粹是为了说明应用场景而展开) 假设有这么三个详情页,我们设定一个大前提,底层的数据层提供方都是一套的,商品详情展示的服务完全可以做到复用,即三个性情页中,绝大多数的东西都一样,只是不同的...
- 下一篇
JS模块化
一、理解 1、什么是模块、模块化? 将一个复杂的程序依据一定的规范封装成几个文件,并进行组合在一起 2、为什么要模块化? 降低复杂度,提高解耦性,部署方便 3、模块化的好处 避免命名冲突(减少命名空间污染) 更好的分离,按需加载 更高复用性 高可维护性 4、页面引入加载script 模块的使用 举例来说:前端框架layui 的js部分就是采用模块化(用的自己定义的模块化方法) layui.use就是引入模块 layui,define就是定义模块 二、模块化规范 1、CommonJS(node根据该规范编写) 说明: 每一个文件都可以当做一个模块 在服务器端:模块的加载 是运行时同步加载的 在浏览器端:模块需要提前编译打包处理 基本语法: 模块引入:require(xxx) 第三方模块:xxx为模块名 自定义模块:xxx为模块文件路径 暴露模块:exports.xxx = value 和 module.exports = value 暴露的模块 本质是 exports 对象 exports本身是一个空对象 exports.xxx = value是给exports对象添加属性或方法 mod...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Hadoop3单机部署,实现最简伪集群
- CentOS8编译安装MySQL8.0.19