React

监听行为

事件

代码示例:

// src/test/Test01.jsx

import React, {Component} from 'react';

export default class Test01 extends Component {
    click01() {
        console.log('click01')
    }

    click02 = () => {
        console.log('click02')
    }

    render() {
        return (
            <div>
                <button onClick={() => {
                    console.log('onClick')
                }}>提交
                </button>
                <button onClick={this.click01}>提交01</button>
                <button onClick={() => {
                    this.click02()
                }}>提交02
                </button>
            </div>
        );
    }
}
// src/test/Test01.jsx

/*
1. 修正指向的方法
    · call(会自动执行函数)
    · apply(会自动执行函数)
    · bind(不会自动执行函数)
*/
import React, {Component} from 'react';

export default class Test01 extends Component {
    a = 100

    click01(evt) {
        console.log('HQSY02', this.a, evt.target)  // 指向的是undefined而不是Test01
    }

    click02 = () => {
        console.log('HQSY03', this.a)  // 指向的是Test01
    }

    click03() {
        console.log('HQSY04', this.a)  // 指向的是被箭头函数调用的this
    }

    render() {
        return (
            <div>
                <button onClick={() => {
                    console.log('onClick', this.a)  // 函数写在render里面指向是Test01
                }}>提交
                </button>
                <button onClick={this.click01.bind(this)}>提交01</button>
                <button onClick={this.click02}>提交02</button>
                <button onClick={() => this.click03()}>提交03</button>
            </div>
        );
    }
}

const obj01 = {
    name: 'obj01',
    getName() {
        console.log(this.name)
    }
}

const obj02 = {
    name: 'obj02',
    getName() {
        console.log(this.name)
    }
}

const obj03 = {
    name: 'obj03',
    getName() {
        console.log(this.name)
    }
}

obj01.getName.call(obj02)  // 改变原本指向的obj01到obj02
obj02.getName.apply(obj03)  // 改变原本指向的obj02到obj03
obj03.getName.bind(obj01)  // 改变原本指向的obj03到obj01