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 相关文章推荐
模仿jQuery each函数的链式调用
Jul 22 Javascript
js给dropdownlist添加选项的小例子
Mar 04 Javascript
javascript-简单的计算器实现步骤分解(附图)
May 30 Javascript
jQuery :first选择器使用介绍
Aug 09 Javascript
浅谈javascript中的三种弹窗
Oct 21 Javascript
jquery hover 不停闪动问题的解决方法(亦为stop()的使用)
Feb 10 Javascript
JavaScript中的编码和解码函数
Feb 15 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
May 20 jQuery
Node.js实现文件上传的示例
Jun 28 Javascript
node中koa中间件机制详解
Aug 22 Javascript
Vue中使用vue-i18插件实现多语言切换功能
Apr 25 Javascript
angular4实现带搜索的下拉框
Mar 25 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
也谈截取首页新闻 - 范例
2006/10/09 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
PHP调用API接口实现天气查询功能的示例
2017/09/21 PHP
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
2007/01/29 Javascript
js控制div及网页相关属性的代码
2009/12/19 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
JavaScript实现的双向跨域插件分享
2015/01/31 Javascript
如何用js实现鼠标向上滚动时浮动导航
2016/07/18 Javascript
微信小程序 navigation API实例详解
2016/10/02 Javascript
基于JS设计12306登录页面
2016/12/28 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
JS设计模式之命令模式概念与用法分析
2018/02/06 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
[01:25:38]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第一场 1月19日
2021/03/11 DOTA
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
python对json的相关操作实例详解
2017/01/04 Python
开源Web应用框架Django图文教程
2017/03/09 Python
Python实现pdf文档转txt的方法示例
2018/01/19 Python
python机器学习理论与实战(四)逻辑回归
2018/01/19 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
学习Django知识点分享
2019/09/11 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
解决tensorflow训练时内存持续增加并占满的问题
2020/01/19 Python
Django实现后台上传并显示图片功能
2020/05/29 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
使用canvas压缩图片大小的方法示例
2019/08/02 HTML / CSS
中国医药集团国药在线:国药网
2017/02/06 全球购物
公务员年总结的自我评价
2013/10/25 职场文书
施工安全标语
2014/06/07 职场文书
文员转正自我鉴定怎么写
2014/09/29 职场文书
群众路线表态发言材料
2014/10/17 职场文书
邀请函怎么写
2015/01/30 职场文书
看看如何用Python绘制小米新版天价logo
2021/04/20 Python
Java实现房屋出租系统详解
2021/10/05 Java/Android
浅谈Python中对象是如何被调用的
2022/04/06 Python