React HOC 返回一个匿名的 _class

Posted

技术标签:

【中文标题】React HOC 返回一个匿名的 _class【英文标题】:React HOC returns an anonymous _class 【发布时间】:2017-10-05 22:37:23 【问题描述】:

我正在使用 MaterialUI,更具体地说是 TextField 组件,我想以某种方式装饰它以处理组件级别的验证状态。

我知道 react 中的 HOC,这似乎是一种完美的模式。但是我必须返回一个匿名类,因此我无法获得应有的TextField 组件的值,因为返回的类型是_class 而不是TextField

我是否对 HOC 模式做错了什么,或者这不是在不修改其原型的情况下重用组件的最佳方式。任何帮助将不胜感激。

HOC 声明

export default function hocInputValidator( WrappedComponent )
  return class extends Component
    constructor(props)
      super(props);
    

    handleChange()
      console.log('Handling from HOC');
    

    render()
      return <WrappedComponent ...this.props/>
    
  

被装饰组件的调用和导出

export default hocInputValidator(TextField);

当我尝试通过refs 访问装饰组件时,类型是_class 而不是TextField

【问题讨论】:

你能用给定的解决方案解决问题吗?请务必让我们知道。如果没有,我们可以帮助您进一步解决。 你好,拉文德拉!不,不幸的是,无论 HOC 是否不是解决此问题的最佳解决方案,还是在 Material UI 方面的组件实现存在一些问题,奇怪的是,根据我所读到的内容,HOC 是一种组合,因此必须可以通过实现它来解决这个问题,组合只不过是 Liskov 替换原则(SOLID 原则之一),因此,从逻辑角度来看,它很有意义(我只是在猜测)。跨度> 【参考方案1】:

HOC 主要用于示例 Login 的关注点的横切。您的应用程序中的许多组件可能需要登录功能,因此您可以使用 HOC 动态包装它们。 HOC 只会包装传入其中的任何组件。就您而言,我在您的代码中发现了一些问题。我已经在下面修复了它们。

export default function ( WrappedComponent )
     class HocInputValidator extends Component
        constructor(props)
          super(props);
        

        handleChange()
          console.log('Handling from HOC');
        

        render()
          return <WrappedComponent ...this.props/>
        
      
      return HocInputValidator;


调用应该是这样的。

import inputValidator from './components/input_validator';

inputvalidator(TextField);

【讨论】:

【参考方案2】:

您的 HOC 返回一个匿名类,这就是它显示为 _class 的原因。

要解决此问题,您可以 set the HOC's displayName to something descriptive 覆盖 _class 显示行为。

例如,您可以在 DOM 中将 HOC 显示为类似 HigherOrderComponent(WrappedComponent) 的内容,这样更具描述性(并且更易于调试)。这是 react-redux 等其他库遵循的约定。

【讨论】:

以上是关于React HOC 返回一个匿名的 _class的主要内容,如果未能解决你的问题,请参考以下文章

React - 返回使用另一个 HOC 的组件的 HOC

react-高阶组件-Hoc

[react] 使用ES6的class定义的组件不支持mixins了,那用什么可以替代呢?

什么是透明匿名高匿代理?详解!

TypeScript React HOC 返回类型与装饰器兼容

React: 高阶组件(HOC)