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 08 Javascript
js中判断文本框是否为空的两种方法
Jul 31 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
Aug 27 Javascript
jquery中EasyUI使用技巧小结
Feb 10 Javascript
JavaScript模拟实现键盘打字效果
Jun 29 Javascript
javascript绘制漂亮的心型线效果完整实例
Feb 02 Javascript
详解js实现线段交点的三种算法
Aug 09 Javascript
DOM中事件处理概览与原理的全面解析
Aug 16 Javascript
AngularJS指令详解及示例代码
Aug 16 Javascript
js制作网站首页图片轮播特效代码
Aug 30 Javascript
Ajax使用原生态JS验证用户名是否存在
May 26 Javascript
vant时间控件使用方法详解
Dec 24 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原创论坛
2006/10/09 PHP
Ajax+PHP 边学边练 之二 实例
2009/11/24 PHP
mysql,mysqli,PDO的各自不同介绍
2012/09/19 PHP
php数组删除元素示例
2014/03/21 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
js压缩利器
2007/02/20 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
EXTJS内使用ACTIVEX控件引起崩溃问题的解决方法
2010/03/31 Javascript
JQuery扩展插件Validate—4设置错误提示的样式
2011/09/05 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
用javascript替换URL中的参数值示例代码
2014/01/27 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
javascript和jquery实现用户登录验证
2016/05/04 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
bmob js-sdk 在vue中的使用教程
2018/01/21 Javascript
浅谈Vue.use的使用
2018/08/29 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
[02:38]2018年度DOTA2最佳劣单位选手-完美盛典
2018/12/17 DOTA
[02:07]TI9显影之尘系列 - Vici Gaming
2019/08/20 DOTA
python检测服务器是否正常
2014/02/16 Python
wxpython学习笔记(推荐查看)
2014/06/09 Python
python写一个md5解密器示例
2018/02/23 Python
Python 删除连续出现的指定字符的实例
2018/06/29 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
2020/02/24 Python
Python3标准库之threading进程中管理并发操作方法
2020/03/30 Python
Python如何实现FTP功能
2020/05/28 Python
英国图书音像网站:Hive.co.uk(图书、电子书、DVD、蓝光、音乐CD等)
2017/10/16 全球购物
澳洲CFL商城:CHEMIST FOR LESS(中文)
2021/02/28 全球购物
技校毕业生的自我评价
2013/12/27 职场文书
教师绩效工资方案
2014/02/01 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS