关于前端:React事件绑定的几种方法对比

React事件绑定

因为类的办法默认不会绑定this,因而在调用的时候如果遗记绑定,this的值将会是undefined。

通常如果不是间接调用,应该为办法绑定this。绑定形式有以下几种:
1. 在构造函数中应用bind绑定this

    class Box extends React.Component {
        constructor(props) {
            super(props);
            this.handleClick = this.handleClick.bind(this);
        }
        handleClick() {
            console.log('this is:', this);
        }
        render() {
            return (
                <button onClick={this.handleClick}>
                    Click me
                </button>
            );
        }
    }

2. 在调用的时候应用bind绑定this

  class Box extends React.Component {
        handleClick() {
            console.log('this is:', this);
        }
        render() {
            return (
                <button onClick={this.handleClick.bind(this)}>
                    Click me
                </button>
            );
        }
    }

3. 在调用的时候应用箭头函数绑定this

 class Box extends React.Component {
        handleClick() {
            console.log('this is:', this);
        }
        render() {
            return (
                <button onClick={() => this.handleClick()}>
                    Click me
                </button>
            );
        }
    }

4. 应用属性初始化器语法绑定this(实验性)

 class Box extends React.Component {
        handleClick = () => {
            console.log('this is:', this);
        }
        render() {
            return (
                <button onClick={this.handleClick}>
                    Click me
                </button>
            );
        }
    }

比拟

形式2和形式3都是在调用的时候再绑定this。

  • 长处:写法比较简单,当组件中没有state的时候就不须要增加类构造函数来绑定this
  • 毛病:每一次调用的时候都会生成一个新的办法实例,因而对性能有影响,并且当这个函数作为属性值传入低阶组件的时候,这些组件可能会进行额定的从新渲染,因为每一次都是新的办法实例作为的新的属性传递。

形式1在类构造函数中绑定this,调用的时候不须要再绑定

  • 长处:只会生成一个办法实例,并且绑定一次之后如果屡次用到这个办法也不须要再绑定。
  • 毛病:即便不必到state,也须要增加类构造函数来绑定this,代码量多一点。。。

形式4:利用属性初始化语法,将办法初始化为箭头函数,因而在创立函数的时候就绑定了this。

  • 长处:创立办法就绑定this,不须要在类构造函数中绑定,调用的时候不须要再作绑定。联合了形式1、形式2、形式3的长处
  • 毛病:目前依然是实验性语法,须要用babel转译

总结

形式1是官网举荐的绑定形式,也是性能最好的形式。形式2和形式3会有性能影响并且当办法作为属性传递给子组件的时候会引起重渲问题。形式4目前属于实验性语法,然而是最好的绑定形式,须要联合bable转译

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理