如何在传递给构造函数的箭头函数中访问类属性?

托马斯·H

我定义了一个类来在React登录页面上呈现身份验证方法,该接口包括一个我想覆盖的默认呈现函数。

class AuthMethod {
    constructor(initializer: Pick<AuthMethod, 'id'> & Partial<AuthMethod>) {
        Object.assign(this, initializer);
    }
    id!: string;
    text: string = "";
    enabled: boolean = false;
    icon: React.ReactNode = React.Fragment;
    render: () => React.ReactNode = () => (
        <WhiteIconButton key={this.id} disabled={!this.enabled} >
            {this.icon}
        </WhiteIconButton>
    );
}

我初始化了这些数组,以便在一些地方使用(例如登录表单):

const authMethods: AuthMethod[] = [
    new AuthMethod({
        id: "auth_facebook",
        text: "Sign in with Facebook",
        enabled: false,
        icon: <FontAwesomeIcon icon={faFacebookSquare} />,
        // render: () => this.icon  // This doesn't work
    }),
    new AuthMethod({
        id: "auth_twitter",
        text: "Sign in with Twitter",
        enabled: false,
        icon: <FontAwesomeIcon icon={faTwitter} />
    }),
    new AuthMethod({
        id: "auth_google",
        text: "Sign in with Google",
        enabled: true,
        icon: <FontAwesomeIcon icon={faGoogle} />
    })
];

以后我可以像这样渲染它们:

<div className={classes.socialLine}>
    { authMethods.map(m => m.render()) }
</div>

问题是我无法使用使用类的属性的箭头来覆盖“ render”箭头,在Facebook示例中,如果我取消注释“ render:”行,则会收到错误消息“包含的箭头函数捕获全局值”这个的'”。

如何访问提供的箭头功能中的成员属性?

编辑:您可以在这里运行它:https : //codesandbox.io/s/tender-bhabha-8jdmf?fontsize=14&hidenavigation=1&theme=dark

只需取消注释“ render:”行即可查看问题。

解:

感谢jcalz提供了答案,箭头函数无法访问“ this”属性(因为它绑定到创建该属性的任何“ this”)。因此解决方案是使用“正常”功能(非箭头)。我以为当类定义中的签名是箭头函数时,这是行不通的,但事实并非如此,解决方案是:

  new AuthMethod({
    id: "auth_facebook",
    text: "Sign in with Facebook",
    enabled: false,
    icon: <FontAwesomeIcon icon={faFacebookSquare} />,
    render: function() {
      return this.icon;
    }
  }),

您可以在这里查看它的运行情况:https : //8jdmf.csb.app/

卡兹

箭头函数没有自己的this上下文,这与非箭头函数(例如,用function关键字定义的函数)不同因此,this在箭头函数主体进行的任何提及实际上都this将引用其词法上下文中所指的内容,这不是您想要的。

这里最直接的解决方案是放弃箭头功能。您可以使用类似的匿名函数function(){return this.icon},也可以使用terser方法语法

  new AuthMethod({
    render(){return this.icon}, 
    id: "auth_facebook",
    text: "Sign in with Facebook",
    enabled: false,
    icon: <FontAwesomeIcon icon={faFacebookSquare} />
  }),

这应该可行,并且可以说是您正在做的事情的常规方式。好吧,希望能有所帮助;祝好运!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在构造函数之外访问类属性

来自分类Dev

如何将派生的类属性传递给基类的构造函数

来自分类Dev

将派生类属性传递给Angular中的基类构造函数时出错

来自分类Dev

如何在函数构造函数javascript中访问属性

来自分类Dev

Python访问父构造函数中的派生类属性

来自分类Dev

访问构造函数的基类属性

来自分类Dev

如何在类属性中存储函数?

来自分类Dev

Java如何在调用父构造函数之前覆盖子类中的父类属性

来自分类Dev

Kotlin:如何访问构造函数中的属性

来自分类Dev

如何将必需的属性传递给元素构造函数

来自分类Dev

如何仅序列化传递给构造函数的属性?

来自分类Dev

如何在MVC中将参数传递给GenericController构造函数?

来自分类Dev

从原型中定义的函数访问类属性

来自分类Dev

如何访问构造函数的属性?

来自分类Dev

Javascript:从传递给Promise构造函数的函数中访问Promise对象

来自分类Dev

如何在FutureBuilder中将参数传递给Future属性函数

来自分类Dev

打字稿:如何在构造函数外部初始化类属性

来自分类Dev

如何从传递给函数的群体中访问单个代理?

来自分类Dev

如何在Python中将随机键值对传递给函数/构造函数?

来自分类Dev

如何继承基类属性并在JavaScript中调用基类构造函数?

来自分类Dev

如何在函数对象javascript中访问属性函数

来自分类Dev

如何将字段构造函数参数传递给函数?

来自分类Dev

如何在Javascript构造函数中传递参数?

来自分类Dev

Android - 如何在构造函数中传递位图?

来自分类Dev

如何在构造函数Angular中传递对象?

来自分类Dev

如何在构造函数中传递数组元素?

来自分类Dev

输入构造函数中传递的任意属性

来自分类Dev

如何在类构造函数中访问RTTI?

来自分类Dev

如何在单独的类中访问私有构造函数?

Related 相关文章

  1. 1

    如何在构造函数之外访问类属性

  2. 2

    如何将派生的类属性传递给基类的构造函数

  3. 3

    将派生类属性传递给Angular中的基类构造函数时出错

  4. 4

    如何在函数构造函数javascript中访问属性

  5. 5

    Python访问父构造函数中的派生类属性

  6. 6

    访问构造函数的基类属性

  7. 7

    如何在类属性中存储函数?

  8. 8

    Java如何在调用父构造函数之前覆盖子类中的父类属性

  9. 9

    Kotlin:如何访问构造函数中的属性

  10. 10

    如何将必需的属性传递给元素构造函数

  11. 11

    如何仅序列化传递给构造函数的属性?

  12. 12

    如何在MVC中将参数传递给GenericController构造函数?

  13. 13

    从原型中定义的函数访问类属性

  14. 14

    如何访问构造函数的属性?

  15. 15

    Javascript:从传递给Promise构造函数的函数中访问Promise对象

  16. 16

    如何在FutureBuilder中将参数传递给Future属性函数

  17. 17

    打字稿:如何在构造函数外部初始化类属性

  18. 18

    如何从传递给函数的群体中访问单个代理?

  19. 19

    如何在Python中将随机键值对传递给函数/构造函数?

  20. 20

    如何继承基类属性并在JavaScript中调用基类构造函数?

  21. 21

    如何在函数对象javascript中访问属性函数

  22. 22

    如何将字段构造函数参数传递给函数?

  23. 23

    如何在Javascript构造函数中传递参数?

  24. 24

    Android - 如何在构造函数中传递位图?

  25. 25

    如何在构造函数Angular中传递对象?

  26. 26

    如何在构造函数中传递数组元素?

  27. 27

    输入构造函数中传递的任意属性

  28. 28

    如何在类构造函数中访问RTTI?

  29. 29

    如何在单独的类中访问私有构造函数?

热门标签

归档