在NextJS中,如果对HOC使用hoistNonReactStatic getInitialProps,为什么会丢失(Redux)存储?

时间:2019-09-10 13:14:27

标签: javascript reactjs redux next.js

完全为此感到难过。尝试从HOC触发getInitialProps,但这样做时我丢失了ctx / reduxStore值?

这是我的代码/上下文:-

我的主页有getInitialProps,我想触发一个redux传奇,它从git gist中获取一些json-并将其放入redux存储中。数据将通过道具提取并渲染等。

到目前为止,这可行。

但是...主页由HOC(具有身份验证)包装。

据我了解,这意味着{strong>中的getInitialProps现在不会触发,因为它不再从/ pages中导出-它是从{{1 }}

为了清楚起见,基本上是这样的:

pages / home.js

/HOCs/with-authentication.js

我正在使用的HOC,因此需要以某种方式使用它的静态getInitialProps方法。

/HOCs/with-authentication.js

import React from 'react';
...
import withAuthentication from '../HOCs/with-auth';

class HomePage extends React.Component {
  constructor() {
    super();
    this.state = {};
  }

  static async getInitialProps({ reduxStore, req }) {
    reduxStore.dispatch(fetchJSONFromGist()) <-- dont think i need 'await' here because it doesnt return a promise.
      return {}
  }
...
...
export default compose(
   withAuthentication,
   connect(mapState, mapDispatch),
)(HomePage);

因此这实际上可行,它会触发首页import React from 'react'; import hoistNonReactStatic from 'hoist-non-react-statics'; const withAuthenticationHOC = PlatformSpecificComponent => { class withAuthenticationClass extends React.Component { constructor(props) { super(props); this.state = {}; } render() { return ( <PlatformSpecificComponent {...this.props} /> ); } } hoistNonReactStatic(withAuthenticationClass, PlatformSpecificComponent); // ^^ hoisting static methods from the HomePage i'm wrapping with the HOC ^^ if (withAuthenticationClass.getInitialProps) { withAuthenticationClass.getInitialProps() } // ^^ if the class has a getInitialProps method, fire it off // return compose( withFirebaseHOC connect( null, mapDispatchToProps ) )(withAuthenticationClass); }; export default withAuthenticationHOC; ,但是如果我尝试添加类似getInitialProps的参数,那么我就可以触发reduxStore了,它们就不在了。

要使其正常工作,我必须从HomePage中使用身份验证删除,然后HomePage的dispatch()正常运行。

我如何获得reduxStore和req(如果需要req?)可用于HOC级别?

在HOCified页面上使用static async getInitialProps({ reduxStore, req }) {...有更简单的方法吗?

我所见过的一切似乎都失败了:(

0 个答案:

没有答案