React.Component的组件里面方法绑定四种方式

react官方推荐使用类似class B extends React.Component这样的方式来写组件,相比于React.createClass({})这种方式,React.createClass的this是自动绑定到组件本身,

即var component = React.createClass({}); //{}里面的this指向component本身

而extends React.Component不会这样,要手动指向组件本身。在es6的react写法里面有四个方法:

直接上代码...

import React from 'react'

class B extends React.Component {
    constructor (props) {
        super(props)
        this.handleClickOne = this.handleClickOne.bind(this)
        this.handleClickFour = ::this.handleClickFour
    }

    handleClickOne () {
        alert('点击一')
        console.log('使用   this.handleClickOne = this.handleClickOne.bind(this)')
    }

    handleClickTwo () {
        alert('点击二')
        console.log('使用   this.handleClickFour = ::this.handleClickFour')
    }

    handleClickThree = () => {
        alert('点击三')
        console.log('使用   handleClickThree = () => {alert("点击三")}')
    }

    handleClickFour () {
        alert('点击四')
        console.log('使用   this.handleClickFour = ::this.handleClickFour')
    }

    render () {
        return(
        <div className="content">
        <p>
            <button onClick={this.handleClickOne}>点击一</button>
            <br /><br />
            <button onClick={ () => this.handleClickTwo()}>点击二</button>
            <br /><br />
            <button onClick={this.handleClickThree}>点击三</button>
            <br /><br />
            <button onClick={this.handleClickFour}>点击四</button>
            <br /><br />
        </p>
        </div>);
    }
}

export default B
handleClickOne,handleClickTwo,handleClickThree,handleClickFour分别代表四种不同的绑定和调用方式
第一种:
constructor (props) {
        super(props)
        this.handleClickOne = this.handleClickOne.bind(this)
    }
handleClickOne () {
        alert('点击一')
        console.log('使用   this.handleClickOne = this.handleClickOne.bind(this)')
    }
调用时,
 <button onClick={this.handleClickOne}>点击一</button>

第二种:

handleClickTwo () {
        alert('点击二')
        console.log('使用   this.handleClickFour = ::this.handleClickFour')
    }

调用时,

<button onClick={ () => this.handleClickTwo()}>点击二</button>
第三种:
handleClickThree = () => {
        alert('点击三')
        console.log('使用   handleClickThree = () => {alert("点击三")}')
    }
调用时,
<button onClick={this.handleClickThree}>点击三</button>
第四种:
constructor (props) {
        super(props)
        this.handleClickFour = ::this.handleClickFour
    }

    handleClickFour () {
        alert('点击四')
        console.log('使用   this.handleClickFour = ::this.handleClickFour')
    }

调用时,

<button onClick={this.handleClickFour}>点击四</button>

第四种是es7的写法,双冒号 this.handleClickFour = ::this.handleClickFour 是this.handleClickOne = this.handleClickOne.bind(this)

在 ES7 中,有一个关于 bind 语法 的提议,提议将 :: 作为一个新的绑定操作符,该操作符会将左值和右值(一个函数)进行绑定。

function map(func) {

var mapped = new Array(this.length);

for(var i = 0; i < this.length; i++) {

mapped[i] = func(this[i], i);

}

return mapped;

}

console.log([1, 2, 3]::map(x => x * 2)) //[2, 4, 6]

github地址:https://github.com/fengnovo/diary/tree/master/react/20161128