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 相关文章推荐
Js 订制自己的AlertBox(信息提示框)
Jan 09 Javascript
Jquery实现点击切换图片并隐藏显示内容(2种方法实现)
Apr 11 Javascript
node.js中的fs.fchownSync方法使用说明
Dec 16 Javascript
javascript实现根据时间段显示问候语的方法
Jun 18 Javascript
uploadify多文件上传参数设置技巧
Nov 16 Javascript
AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
Feb 25 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
Feb 08 Javascript
vue通过style或者class改变样式的实例代码
Oct 30 Javascript
微信小程序(订阅消息)功能
Oct 25 Javascript
vuecli3.x中轻松4步带你使用tinymce的步骤
Jun 25 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
Jul 24 Javascript
前端JavaScript大管家 package.json
Nov 02 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
ThinkPHP中公共函数路径和配置项路径的映射分析
2014/11/22 PHP
php创建图像具体步骤
2017/03/13 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
PHP chunk_split()函数讲解
2019/02/12 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
thinkphp5使html5实现动态跳转的例子
2019/10/16 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
laravel admin实现分类树/模型树的示例代码
2020/06/10 PHP
Use Word to Search for Files
2007/06/15 Javascript
jQuery-ui中自动完成实现方法
2010/06/10 Javascript
JS 日期比较大小的简单实例
2014/01/13 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
JavaScript中Require调用js的实例分享
2017/10/27 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
使用layui日期控件laydate对开始和结束时间进行联动控制的方法
2019/09/06 Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
2020/02/03 Javascript
vue 实现tab切换保持数据状态
2020/07/21 Javascript
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
2018/01/29 Python
老生常谈python中的重载
2018/11/11 Python
python生成九宫格图片
2018/11/19 Python
苹果Mac升级:MacSales.com
2017/11/20 全球购物
以太网Ethernet IEEE802.3
2013/08/05 面试题
领导失职检讨书
2014/02/24 职场文书
浪费资源的建议书
2014/03/12 职场文书
需求分析说明书
2014/05/09 职场文书
4S店销售内勤岗位职责
2015/04/13 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
会议承办单位欢迎词
2015/09/30 职场文书
Java elasticsearch安装以及部署教程
2021/06/28 Java/Android