美文网首页
React:引入class关键字后this的绑定问题

React:引入class关键字后this的绑定问题

作者: 勇往直前888 | 来源:发表于2017-08-14 16:43 被阅读85次

使用React.createClass会自动绑定每个方法的this到当前组件,但使用ES6 class关键字时,这种自动绑定功能就没有,需要手动绑定this。不然的话,经常出现thisundefined的现象。
比如下面的test2中的this指向就不正确了。

import React from 'react';

export default class App extends React.Component{

    constructor(props){
        super(props);
    }

    render(){

        this.test1();

        return (
            <div onClick={ this.test2 }>abc</div>
        )
    }

    test1(){
        console.log(this); // App
    }

    test2(){
        console.log(this); // null
    }
}

解决方案一:采用箭头函数
箭头函数将this和函数定义时的上下文绑定,能达到期望的效果。

render() {

    this.test1();   // 这里不存在歧义,可以直接用

    return (
        <div onClick={ () => this.test2() }>abc</div>   // 这里用箭头函数,让this和定义时的上下文绑定,这里是App
    )
}

解决方案二:在回调响应的地方手动绑定

render() {

    this.test1();   // 这里不存在歧义,可以直接用

    return (
        <div onClick={ this.test2.bind(this) }>abc</div>   // 手动绑定;绑定当前组件App,而不是执行时的<div>标签
    )
}

解决方案三:构造函数中手动绑定

constructor(props) {
    super(props);
    
    this.test2 = this.test2.bind(this); // 将this和当前组件绑定
}

React.createClass估计采用的就是这种方案,构造函数将所有的function成员都自动绑定一下。

选择的方案

  • 大多数时候可以选择方案一,用箭头函数,比较简洁;
  • 如果箭头函数不起左右,可以选择bind的方式;

参考文章

React绑定this的三种方式

理解React中es6方法创建组件的this

React中使用ES6 class的this指向?

相关文章

  • React:引入class关键字后this的绑定问题

    使用React.createClass会自动绑定每个方法的this到当前组件,但使用ES6 class关键字时,这...

  • 类(Javascript)

    类class(Javascript) 为了解决js混合和冗长的问题, ES6新引入了 class关键字具有正式定义...

  • vue学习笔记

    开始: 引入vue包 var app=new Vue({ el:'#app', 绑定id 或者class data...

  • 7、VUE动态绑定class和style

    1、绑定class 绑定单个class 渲染完成的结果 绑定多个class 渲染完成的结果 数组方式绑定class...

  • React中constructor(props){}究竟是什么

    在React Class中设置state的初始值或者绑定事件时 为什么需要在 constructor(){} 中加...

  • react从0到1的探索记录02

    9、在react中如何创建组件 ES6中class关键字的作用 class关键字中构造器constructor的了...

  • 第六节:TypeScript类

    Class 类 TypeScript 支持ES2015中引入的关键字class 与其他JavaScript语言功能...

  • Swift—值类型struct和引用类型class

    Swift通过 struct 关键字引入结构体,通过 class 关键字引入类。他们之间有很多共同点,如: 定义属...

  • ES6中的class

    (在封装Koa时用到) 一、class概述 class作为对象的模板被引入,可以通过class关键字定义类,通过n...

  • Swift类和结构体

    1、定义语法 结构体和类有着相似的定义方式,通过 struct 关键字引入结构体,通过 class 关键字引入类:...

网友评论

      本文标题:React:引入class关键字后this的绑定问题

      本文链接:https://www.haomeiwen.com/subject/vhburxtx.html