前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >React中定义函数的三种方式

React中定义函数的三种方式

作者头像
刘亦枫
发布2020-03-19 17:29:35
4.1K0
发布2020-03-19 17:29:35
举报

写法一:让函数内部的this指向这个类的实例,它是用bind实现的,bind的第一个参数表示context,就是this。

代码语言:javascript
复制
//写法一
class ManageAddress extends React.Component {

    constructor(props) {
        super(props);
        this.handleChangeAddressType = this.handleChangeAddressType.bind(this)
        ...
    }

    /**
     * 切换地址类型,重新获取地址列表
     * @param key
     */
    handleChangeAddressType(key) {
     ...
    };

  render() {
        return (
            ...
            <button onClick={this.handleChangeAddressType}>测试</button >
           ...
        )
    }
}

这种方式的好处是每次render不会重新创建一个回调函数,没有额外的性能损失。但在构造函数中,为事件处理函数绑定this,尤其是存在多个事件处理函数需要绑定时,这种模版式的代码还是会显得繁琐。

写法二:相当于让handleChangeAddressType的值为一个箭头函数,所以调用处直接传入这个值就可以,注意不能加括号会报错。而箭头函数的特性我们都知道:它不会自己创建this,它会从自己的作用域链上层继承this,这里this就会指向这个类的实例。这不是js标准写法,但是babel已经支持了。

代码语言:javascript
复制
//写法二
class ManageAddress extends React.Component {

    constructor(props) {
        super(props);
        ...
    }

    /**
     * 切换地址类型,重新获取地址列表
     * @param key
     */
    handleChangeAddressType = (key) =>{
     ...
    };

  render() {
        return (
            ...
            <button onClick={this.handleChangeAddressType}>测试</button >
           ...
        )
    }
}

这种方式既不需要在构造函数中手动绑定this,也不需要担心组件重复渲染导致的函数重复创建问题。

写法三:在调用处使用箭头函数,与第二种方法类似

代码语言:javascript
复制
//写法三
class ManageAddress extends React.Component {

    constructor(props) {
        super(props);
        ...
    }

    /**
     * 切换地址类型,重新获取地址列表
     * @param key
     */
    handleChangeAddressType(key) {
     ...
    };

  render() {
        return (
            ...
            <button onClick={(key)=>this.handleChangeAddressType(key)}>测试</button >
           ...
        )
    }
}

直接在render方法中为元素事件定义事件处理函数,最大的问题是,每次render调用时,都会重新创建一次新的事件处理函数,带来额外的性能开销,组件所处层级越低,这种开销就越大,因为任何一个上层组件的变化都可能会触发这个组件的render方法。当然,在大多数情况下,这种性能损失是可以不必在意的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档