我有两个任务:
- 用 HOC 替换装饰器
- 是否可以构建一个返回纯函数而不是类的 HOC?又有多大意义,速度会不会有显着提升?
// _app.js
@myDecorator(SelfClassForSaga, ['str1', 'str2'])
class MyApp extends App {
static async getInitialProps({Component, ctx}) {
await ctx.store.stopSaga();
await ctx.store.execSagaTasks(ctx, dispatch => {
dispatch(SelfClassForSaga.actions.str1());
});
const pageProps = Component.getInitialProps ? await Component.getInitialProps(ctx) : {};
return {pageProps};
}
render() {...}
}
export default MyApp;
// 我的装饰器
export const myDecorator = (SelfClassForSaga, StrArr) => (Component) => {}
我想用 HOC 替换装饰器,以便 _app 组件本身可以成为一个函数:
// HOC(我如何做 HOC 返回“类”):
export const myHOC = (WrappedComponent, SelfClassForSaga, strArr) => {
class WithHOC extends React.Component {
constructor(props) {
super(props);
}
public static async getInitialProps(ctx) {
return WrappedComponent.getInitialProps ? await WrappedComponent.getInitialProps(ctx) : {};
}
// logic from old decorator(myDecorator) for SelfClassForSaga and StrArr
public render() {
return (
<WrappedComponent {...this.props} />
);
}
}
}
我想使用该功能:
const myHOC = (WrappedComponent, SelfClassForSaga, StrArr) => ({...props}) => {
return <WrappedComponent {...props}/>
}
并相应地更改 _app.js 中的导出:
const WrappedApp = myHOC(MyApp, SelfClassForSaga, ['str1', 'str2']);
export default WrappedApp;
当然!,我得到一个错误,因为我没有在函数中调用 getInitialProps:
TypeError: Cannot read property 'execSagaTasks' of undefined (ctx is missing)
事实是/pages中的页面也包裹在 HOC 中,并且在浏览器中它还说没有ctx
如何正确调用 getInitialProps 并进一步返回包装的组件?谢谢你的帮助!