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 URL锚点取值方法
Feb 25 Javascript
Javascript 判断Flash是否加载完成的代码
Apr 12 Javascript
setTimeout和setInterval的区别你真的了解吗?
Mar 31 Javascript
js报错 Object doesn't support this property or method的原因分析
Mar 31 Javascript
javascript操作excel生成报表全攻略
May 04 Javascript
使用jquery.upload.js实现异步上传示例代码
Jul 29 Javascript
简介JavaScript中的sub()方法的使用
Jun 08 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
Nov 03 Javascript
js如何获取网页所有图片
May 12 Javascript
谈谈JavaScript中super(props)的重要性
Feb 12 Javascript
微信小程序image图片加载完成监听
Aug 31 Javascript
React实现评论的添加和删除
Oct 20 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
ThinkPHP写第一个模块应用
2012/02/20 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
PHP文件操作详解
2016/12/30 PHP
jQuery EasyUI NumberBox(数字框)的用法
2010/07/08 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
JS控制图片翻转示例代码(兼容firefox,ie,chrome)
2013/12/19 Javascript
JavaScript检测弹出窗口是否已经关闭的方法
2015/03/24 Javascript
js实现基于正则表达式的轻量提示插件
2015/08/29 Javascript
jquery原理以及学习技巧介绍
2015/11/11 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
基于Angularjs实现分页功能
2016/05/30 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
2016/06/08 Javascript
微信小程序picker组件下拉框选择input输入框的实例
2017/09/20 Javascript
Vue中的Vux配置指南
2017/12/08 Javascript
Vue使用mixins实现压缩图片代码
2018/03/14 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
Django如何配置mysql数据库
2018/05/04 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
python 判断linux进程,并杀死进程的实现方法
2019/07/01 Python
Python学习笔记之迭代器和生成器用法实例详解
2019/08/08 Python
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
Hotels.com韩国:海外国内旅行所需的酒店和住宿预订网站
2020/05/08 全球购物
临床医学专业学生的自我评价分享
2013/11/21 职场文书
英语生日邀请函
2014/01/23 职场文书
少年闰土教学反思
2014/02/22 职场文书
地理教师岗位职责
2014/03/16 职场文书
廉洁校园实施方案
2014/05/25 职场文书
工地门卫岗位职责范本
2014/07/01 职场文书
房产公证委托书范本
2014/09/20 职场文书
个人批评与自我批评发言稿
2014/09/28 职场文书
承诺书范本
2015/01/21 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
golang中的空slice案例
2021/04/27 Golang