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 从if else 到 switch case 再到抽象
Jul 17 Javascript
jquery实现div阴影效果示例代码
Sep 16 Javascript
鼠标滑在标题上显示图片的JS代码
Nov 19 Javascript
技术男用来对妹子表白的百度首页
Jul 23 Javascript
Javascript核心读书有感之语句
Feb 11 Javascript
js跨域请求的5中解决方式
Jul 02 Javascript
javascript基本算法汇总
Mar 09 Javascript
layui前段框架日期控件使用方法详解
May 19 Javascript
微信小程序实现的五星评价功能示例
Apr 25 Javascript
javascript实现导航栏分页效果
Jun 27 Javascript
node-red File读取好保存实例讲解
Sep 11 Javascript
原生js实现的金山打字小游戏(实例代码详解)
Mar 16 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
php 操作调试的方法
2012/07/12 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
JavaScript 原型学习总结
2010/10/29 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
window.onload追加函数使用示例
2014/03/03 Javascript
原生JavaScript生成GUID的实现示例
2014/09/05 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
深入分析下javascript中的[]()+!
2015/07/07 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
nodejs实现的连接MySQL数据库功能示例
2018/01/25 NodeJs
让你5分钟掌握9个JavaScript小技巧
2018/06/09 Javascript
详解实现一个通用的“划词高亮”在线笔记功能
2019/04/23 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
python 搭建简单的http server,可直接post文件的实例
2019/01/03 Python
关于python字符串方法分类详解
2019/08/20 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
2020/01/06 Python
AUC计算方法与Python实现代码
2020/02/28 Python
python源文件的字符编码知识点详解
2021/03/04 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
大型晚会策划方案
2014/02/06 职场文书
中层领导干部群众路线对照检查材料思想汇报
2014/10/02 职场文书
大学生见习报告总结
2014/11/04 职场文书
运动会通讯稿100字
2015/07/20 职场文书
结婚幸福感言
2015/08/01 职场文书
导游词之青岛崂山
2019/12/27 职场文书
教你解决往mysql数据库中存入汉字报错的方法
2021/05/06 MySQL
在容器中使用nginx搭建上传下载服务器
2022/05/11 Servers
vue实现登陆页面开发实践
2022/05/30 Vue.js