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] 使用ES6的class定义的组件不支持mixins了,那用什么可以替代呢?