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 相关文章推荐
JavaScript 提升运行速度之循环篇 译文
Aug 15 Javascript
jquery中this的使用说明
Sep 06 Javascript
JavaScript之自定义类型
May 04 Javascript
js操纵跨frame的三级联动select下拉选项实例介绍
May 19 Javascript
深入剖析JavaScript中的枚举功能
Mar 06 Javascript
【JS+CSS3】实现带预览图幻灯片效果的示例代码
Mar 17 Javascript
Bootstrap中的Panel和Table全面解析
Jun 13 Javascript
如何在JS中实现相互转换XML和JSON
Jul 19 Javascript
实现两个文本框同时输入的实例
Sep 25 Javascript
vue如何安装使用Quill富文本编辑器
Sep 21 Javascript
微信小游戏之使用three.js 绘制一个旋转的三角形
Jun 10 Javascript
详解javascript脚本何时会被执行
Feb 05 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
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
php引用地址改变变量值的问题
2012/03/23 PHP
php中通过数组进行高效随机抽取指定条记录的算法
2013/09/09 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
PHP实现文件上传下载实例
2016/10/18 PHP
php实现微信企业号支付个人的方法详解
2017/07/26 PHP
使用自定义setTimeout和setInterval使之可以传递参数和对象参数
2009/04/24 Javascript
javascript demo 基本技巧
2009/12/18 Javascript
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
基于jquery的jqDnR拖拽溢出的修改
2011/02/12 Javascript
js转化毫秒为时间格式代码
2014/04/10 Javascript
Bootstrap每天必学之导航条(二)
2016/03/01 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
BootStrap树状图显示功能
2016/11/24 Javascript
详解Webpack DLL用法以及功能
2017/07/11 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
了解Javascript中函数作为对象的魅力
2019/06/19 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
python编程-将Python程序转化为可执行程序[整理]
2007/04/09 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
numpy.transpose()实现数组的转置例子
2019/12/02 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
2020/06/08 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
经典c++面试题三
2015/07/08 面试题
什么是Remote Module
2016/06/10 面试题
工程专业求职自荐书范文
2014/02/18 职场文书
2014年银行员工工作总结
2014/11/12 职场文书
《詹天佑》教学反思
2016/02/20 职场文书
资深HR教你写好简历中的自我评价
2019/05/07 职场文书
JS setTimeout与setInterval的区别
2022/04/20 Javascript