我创建了以下高阶组件:
const baseComponent = (WrappedComponent: React.ComponentClass<any>) => (props: IKeyValue) => {
if (props.isLoading) {
return (
<LoadingSpinnerComponent shown={true} />
);
}
return (
<WrappedComponent {...props} />
);
};
这导致该组件被无限期地调用。(componentDidMount
在myComponent
意愿中,意味着正在重新创建此组件)。
我通过以下方式使用它:
export default connect(
mapStateToProps,
dispatchToProps,
)(baseComponent(myComponent)) as React.ComponentClass<any>;
删除 if 部分时:
if (props.isLoading) {
return (
<LoadingSpinnerComponent shown={true} />
);
}
该组件只会被调用一次。我试图深入调试 react lib 代码,但魔法对我来说是一个奇迹。任何的想法?
提前致谢!
编辑:
完整代码
myComponent
::
class MiniCatalogContainer extends React.PureComponent<IProps, void> {
public componentDidMount() {
const { fetchCatalog} = this.props;
fetchCatalog({path});
}
public render() {
...
}
}
export default connect(
mapStateToProps,
dispatchToProps,
)(baseComponent(MyComponent)) as React.ComponentClass<any>;
promise-middleware
import { Dispatch } from 'react-portal/src/interfaces';
import isPromise from 'react-portal/src/utils/is-promise';
interface IOptions {
dispatch: Dispatch;
}
export default function promiseMiddleware({ dispatch }: IOptions) {
return (next: Dispatch) => (action: any) => {
if (!isPromise(action.payload)) {
return next(action);
}
const { types, payload, meta } = action;
const { promise, data } = payload;
const [ PENDING, FULFILLED, REJECTED ] = types;
/**
* Dispatch the pending action
*/
dispatch( { type: PENDING,
...(data ? { payload: data } : {}),
...(meta ? { meta } : {}),
});
/**
* If successful, dispatch the fulfilled action, otherwise dispatch
* rejected action.
*/
return promise.then(
(result: any) => {
dispatch({
meta,
payload: result,
type: FULFILLED,
});
},
(error: any) => {
dispatch({
meta,
payload: error,
type: REJECTED,
});
},
);
};
}
解决方案:
正如@Shleng 注意到的那样,循环是因为我fetch
在组件内部调用。我最终得到了简单的解决方案:
const baseComponent = (WrappedComponent: React.ComponentClass<any>) => (props: IKeyValue) => {
if (props.isLoading) {
return (
<LoadingSpinnerComponent shown={true} />
<WrappedComponent {...props} />
);
}
return (
<WrappedComponent {...props} />
);
};