提问者:小点点

使用React HOC(高阶组件)、Redux和pass道具获取数据


我想创建一个HOC,它允许我调用从后端获取数据的方法,并在加载时显示加载程序掩码。诀窍是我希望能够为不同的组件传递不同的操作。

所以我想这样称呼它:

export default withPage({
  getLoadingStatus: getStatus,
  actionOnLoad: booksActions.getAllBooksRequest
})(ShareABookContainer);

当我传递一些道具时,我定义了我的Page.js如下:

const withPage = ({
  actionOnLoad,
  getLoadingStatus
}) => WrappedComponent => () => {
  return (
    <PageContainer
      getLoadingStatus={getLoadingStatus}
      wrappedComponent={WrappedComponent}
      actionOnLoad={actionOnLoad}
    />
  );
};

export default withPage;

页面容器。js是最常见的容器,因此:

const PageContainer = props => <PageComponent {...props} />;


const mapStateToProps = (state, ownProps) => ({
  ...
});

const mapDispatchToProps = (dispatch, ownProps) => {
...
};

export default connect(
  mapStateToProps,
  mapDispatchToProps
)(PageContainer);

PageComponent也是一个常见的组件:

class PageComponent extends Component {
  componentDidMount() {
   ...
  }

  render() { return <this.props.wrappedComponent />;
  }
}

export default PageComponent;

发生的事情是,没有任何东西被渲染,如果我使用控制台。我收到的日志wrappedComponent:

包装组件^a(e, t){!函数(e, t){if(!(e instanceof t))抛出新的TypeError("不能调用类作为函数")}(this, a); var r=函数(e, t){if(!e)抛出新的参考错误("这还没有被初始化-超级()...

当我通过一些div时,例如test而不是一切都可以正常工作,但我需要的是渲染通过的组件。

我不知道我做错了什么,互联网上的例子也帮不上忙。我找不到像我这样的情况的例子(因此,将道具传递给HOC并在那里使用Redux,这不是一个就是另一个)。如有任何想法/建议/答案,我将不胜感激。


共1个答案

匿名用户

请尝试更简单的方法:

return (
  <PageContainer
    getLoadingStatus={getLoadingStatus}
    actionOnLoad={actionOnLoad} >
    <WrappedComponent />
  </PageContainer>
);

顺便说一句,做出反应,而不是“不喜欢”

当需要动态组件时,我可能会使用以下内容:

const Wrapped = this.props.wrappedComponent;
render () { return <Wrapped /> }

变量名称必须大写。