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 html()方法使用不了无法显示内容的问题
Aug 06 Javascript
JavaScript中的对象与JSON
Jul 03 Javascript
JS拖拽组件学习使用
Jan 19 Javascript
基于 Node.js 实现前后端分离
Apr 23 Javascript
基于javascript数组实现图片轮播
May 02 Javascript
js实现横向拖拽导航条功能
Feb 17 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
VueJs组件prop验证简单介绍
Sep 12 Javascript
Vue-router 中hash模式和history模式的区别
Jul 24 Javascript
解决vue移动端适配问题
Dec 12 Javascript
JavaScript中this用法学习笔记
Mar 17 Javascript
Vue实现滑动拼图验证码功能
Sep 15 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 session劫持和防范的方法
2013/11/12 PHP
php投票系统之增加与删除投票(管理员篇)
2016/07/01 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
angularjs实现过滤并替换关键字小功能
2017/09/19 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
深入理解Python中各种方法的运作原理
2015/06/15 Python
Python实现绘制双柱状图并显示数值功能示例
2018/06/23 Python
python Tcp协议发送和接收信息的例子
2019/07/22 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
实例讲解CSS3中的box-flex弹性盒属性布局
2016/06/09 HTML / CSS
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
一套比较完整的软件测试人员面试题
2012/05/13 面试题
管理站站长岗位职责
2013/11/27 职场文书
网站文案策划岗位职责
2015/04/14 职场文书
关于幸福的感言
2015/08/03 职场文书
创业计划书之餐饮馄饨店
2019/07/18 职场文书
创业计划书之青年旅馆
2019/09/23 职场文书
在Django中使用MQTT的方法
2021/05/10 Python
springboot+zookeeper实现分布式锁
2022/03/21 Java/Android
nginx日志格式分析和修改
2022/04/28 Servers