如何从 Next.js 中的服务器获取 HOC 中的数据?

Posted

技术标签:

【中文标题】如何从 Next.js 中的服务器获取 HOC 中的数据?【英文标题】:How to fetch data in HOC from server in Next.js? 【发布时间】:2020-07-03 19:04:03 【问题描述】:

我使用 Next.js 9.3.1 创建了新应用。

在带有 s-s-r 的旧应用程序中,我可以在 HOC 组件中(不在页面中)使用 getInitialProps 函数,因此我可以从 HOC 组件中的服务器和页面中获取数据。赞这个https://gist.github.com/whoisryosuke/d034d3eaa0556e86349fb2634788a7a1

例子:

export default function withLayout(ComposedComponent) 
  return class WithLayout extends Component 
    static async getInitialProps(ctx) 
      console.log("ctxlayout fire");
      const  reduxStore, req  = ctx || ;
      const isServer = !!req;
      reduxStore.dispatch(actions.serverRenderClock(isServer));

      if (isServer)
        await reduxStore.dispatch(navigationActions.getListMenuAction("menu"));
      // Check if Page has a `getInitialProps`; if so, call it.
      const pageProps =
        ComposedComponent.getInitialProps &&
        (await ComposedComponent.getInitialProps(ctx));
      // Return props.
      return  ...pageProps ;
    

    render() 
      return (
        <div className="app__container">
          <Header />
          <Navbar />
          <ComposedComponent ...this.props />
        </div>
      );
    
  ;

但是在带有 SSG 的新版 Next.js 中,我找不到在 HOC 组件中使用 getStaticPropsgetServerSideProps 的方法。如果我在 HOC(布局)中使用 getInitialProps,我将无法在子组件中使用 getStaticPropsgetServerSideProps

那么,如何使用getStaticPropsgetServerSideProps 在 HOC 组件和页面中获取数据和预渲染?

【问题讨论】:

【参考方案1】:

因为getServerSideProps/getStaticProps 需要直接从页面组件的文件中导出,所以您必须将该逻辑完全提取到单独的高阶函数 (HOF) 中。

您可以将 React 组件部分保留在 withLayout HOC 中。

// hoc/with-layout.js
export default function withLayout(ComposedComponent) 
    return class WithLayout extends Component 
        render() 
            return (
                <div className="app__container">
                    <Header />
                    <Navbar />
                    <ComposedComponent ...this.props />
                </div>
            );
        
    ;

getInitialProps 中的代码将移至单独的 HOF。此 HOF 将接受 getServerSideProps 函数作为参数,并返回逻辑所在的另一个函数。

// hoc/with-layout.js
export function withLayoutGSSP(gssp) 
    return async (context) => 
        //Add higher-order function logic here
        
        // Return by calling the passed `getServerSideProps` function
        return await gssp(context);
    ;

然后可以在导出 getServerSideProps 函数的页面组件中按如下方式使用它(对于您想要重用 HOC 的任何页面组件都可以这样做)。

import withLayout,  withLayoutGSSP  from '<path-to>/hoc/with-layout'

const IndexPage = () => 
    // Your page component code
;

export const getServerSideProps = withLayoutGSSP(context => 
    // Your `getServerSideProps` code here
);

export default withLayout(IndexPage);

同样的方法可以用于getStaticProps

【讨论】:

以上是关于如何从 Next.js 中的服务器获取 HOC 中的数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 HOC 在 Next.js getInitialProps 中访问使用的 React.Context

使用 Typescript 使用 getInitialProps 将 prop 传递到 Next.js 中的每个页面

Next.js 中的 getInitialProps 不会从服务器获取数据

在 Next.js 中创建一个 HOC(高阶组件)进行身份验证

在 Next.js 中创建一个 HOC(高阶组件)进行身份验证

如何在类组件中使用 next.js 中的“useRouter()”?