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判断CSS文件加载完毕的具体实现
Jan 17 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
Sep 18 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
Nov 04 Javascript
Vue.js教程之计算属性
Nov 11 Javascript
jQuery基于排序功能实现上移、下移的方法
Nov 26 Javascript
Vuex之理解Mutations的用法实例
Apr 19 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
May 20 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
Jul 03 Javascript
jQuery Datatables表头不对齐的解决办法
Nov 27 jQuery
angular 组件通信的几种实现方式
Jul 13 Javascript
webpack4 optimization使用总结
Nov 10 Javascript
详解JS预解析原理
Jun 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
php 保留小数点
2009/04/21 PHP
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
php的list()的一步操作给一组变量进行赋值的使用
2011/05/18 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
2014/10/30 PHP
PHP错误Warning:mysql_query()解决方法
2015/10/24 PHP
php提交post数组参数实例分析
2015/12/17 PHP
理解php依赖注入和控制反转
2016/05/11 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
jQuery异步加载数据并添加事件示例
2014/08/24 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
2016/01/22 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
微信小程序的分类页面制作
2017/06/27 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
一看就会的vuex实现登录验证(附案例)
2020/01/09 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
python查询mysql,返回json的实例
2018/03/26 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
将Django项目部署到CentOs服务器中
2018/10/18 Python
用Python从0开始实现一个中文拼音输入法的思路详解
2019/07/20 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
Django Celery异步任务队列的实现
2019/07/24 Python
python 使用shutil复制图片的例子
2019/12/13 Python
Python flask路由间传递变量实例详解
2020/06/03 Python
django教程如何自学
2020/07/31 Python
学生会个人自荐书范文
2014/02/12 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
学历证明范文
2015/06/16 职场文书
校园之声广播稿
2015/08/18 职场文书