React中this丢失的四种解决方法


Posted in Javascript onMarch 12, 2019

发现问题

我们在给一个dom元素绑定方法的时候,例如:

<input type="text" ref="myinput" accept = "image/*" onChange = {this.selectFile} />

React组件中不能获取refs的值,页面报错提示:Uncaught TypeError: Cannot read property 'refs' of null or undefind

小栗子

import React from 'react';
import $ from 'jquery'
import '../app.scss';

export default class MyForm extends React.Component {
 submitHandler (event) {
  event.preventDefault();
  console.log(this.refs.helloTo);
  var helloTo = this.refs.helloTo.value;
  alert(helloTo);
 }
 render () {
  return (
   <form onSubmit={this.submitHandler}>
     <input ref='helloTo' type='text' defaultValue='Hello World! ' />
     <button type='submit'>Speak</button>
    </form>
  )
 }
}

React中的bind同上方原理一致,在JSX中传递的事件不是一个字符串,而是一个函数(如:onClick={this.handleClick}),此时onClick即是中间变量,所以处理函数中的this指向会丢失。解决这个问题就是给调用函数时bind(this),从而使得无论事件处理函数如何传递,this指向都是当前实例化对象。

解决

解决方案有4种

1、在ES6中可以在构造函数中,直接将当前组件(或者叫类)的实例与函数绑定。

2、在方法调用的时候绑定this

如: <input type="file" ref="myinput" accept = "image/*" onChange = {this.selectFile.bind(this)} />

3、在方法编写结尾的时候绑定this,bind(this)

如:

submitHandler(){
 console.log(1)
}.bind(this)

4、使用es6 箭头函数 myfn = () =>{ console.log(this.refs.can) }

推荐使用箭头函数,因为最近刚换到react 来,没怎么看就直接cli 来怼,遇到一些小问题记录于此

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
新浪刚打开页面出来的全屏广告代码
Apr 02 Javascript
jquery+ashx无刷新GridView数据显示插件(实现分页、排序、过滤功能)
Apr 25 Javascript
Extjs显示从数据库取出时间转换JSON后的出现问题
Nov 20 Javascript
js去空格技巧分别去字符串前后、左右空格
Oct 21 Javascript
JavaScript实现拖拽元素对齐到网格(每次移动固定距离)
Nov 30 Javascript
Angularjs自定义指令Directive详解
May 27 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
Sep 28 Javascript
浅谈js闭包理解
Mar 28 Javascript
JavaScript中Dom操作实例详解
Jul 08 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
Sep 01 Javascript
node.js爬虫框架node-crawler初体验
Oct 29 Javascript
用React Native制作一个简单的游戏引擎
May 27 Javascript
使用koa2创建web项目的方法步骤
Mar 12 #Javascript
如何为你的JS项目添加智能提示与类型检查详解
Mar 12 #Javascript
Vue项目引发的「过滤器」使用教程
Mar 12 #Javascript
通过JS运行机制的角度说说作用域
Mar 12 #Javascript
Jquery的autocomplete插件用法及参数讲解
Mar 12 #jQuery
如何使用pm2快速将项目部署到远程服务器
Mar 12 #Javascript
详解用Webpack与Babel配置ES6开发环境
Mar 12 #Javascript
You might like
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
2011/11/02 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
2014/07/01 PHP
php gd等比例缩放压缩图片函数
2016/06/12 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
JavaScript Event学习第十一章 按键的检测
2010/02/10 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
2014 年最热门的21款JavaScript框架推荐
2014/12/25 Javascript
同一个网页中实现多个JavaScript特效的方法
2015/02/02 Javascript
javascript实现二叉树的代码
2017/06/08 Javascript
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
javascript变量提升和闭包理解
2018/03/12 Javascript
小程序转发探索示例
2019/02/19 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
three.js利用卷积法如何实现物体描边效果
2019/11/27 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
python登陆asp网站页面的实现代码
2015/01/14 Python
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
Python3.7将普通图片(png)转换为SVG图片格式(网站logo图标)动起来
2020/04/21 Python
Python Opencv实现单目标检测的示例代码
2020/09/08 Python
Python 高效编程技巧分享
2020/09/10 Python
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
品牌转让协议书
2014/08/20 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
小学语文复习计划
2015/01/19 职场文书
淮海战役观后感
2015/06/11 职场文书
劳动模范获奖感言
2015/07/31 职场文书
高一军训感想
2015/08/07 职场文书
2016庆祝国庆67周年宣传语
2015/11/25 职场文书
高二英语教学反思
2016/03/03 职场文书