我们正在尝试自定义 HOC 的参数(特别是react-graphql)。由于这个特定库 HOC 的工作方式,我们无法在调用 HOC 后影响组件状态(查询和选项)。
在像connect()
Redux 这样的传统 HOC 工厂中,所有包含的逻辑都会立即应用——这对我们来说还为时过早。相反,我将原始 HOC ( applyOriginalHOC()
) 的应用推迟到从该组件构造第一个实例之前。
export function applyLazyHOC(args) {
return function wrap(WrappedComponent) {
let ComponentWithLazyHOC; // Closed-over value is scoped to component
class LazyHOC extends Component {
constructor() {
super();
// Lazy initialising of HOC to give customisations an opportunity to be registered
if (!ComponentWithLazyHOC) {
ComponentWithLazyHOC = applyOriginalHOC(
// Adds customisations which have been registered by third party code
myCustomization(args)
)(WrappedComponent);
}
}
render() {
return <ComponentWithLazyHOC {...this.props} />;
}
}
return LazyHOC;
};
}
这似乎是一种非常规的方法,所以我正在寻找反馈:
- 你能看到改变 HOC 初始化顺序的副作用吗?我假设 HOC 不应该依赖其他 HOC 的存在。
- 无论如何,HOC 都无法进行静态分析(例如在 IDE 中),因此惰性评估不会使这变得更好或更糟,对吧?
- HOC 可以提供
context
给 React 组件,这些组件在嵌套组件中累积——顺序不重要,对吧? - 组件定义永远不会被卸载,并且
ComponentWithLazyHOC
每个组件(不是组件实例)只创建一次。你能看到任何潜在的内存泄漏吗?