【发布时间】:2019-10-04 05:10:43
【问题描述】:
我有一个使用 next.js 和 Apollo/Graphql 的应用程序,我正在尝试完全了解 getInitialProps 生命周期挂钩的工作原理。
在我的理解中,生命周期getInitialProps 用于设置一些初始道具,这些道具将在应用程序首次加载时呈现服务器端,可用于从数据库中预取数据以帮助 SEO 或只是提高页面加载时间.
我的问题是这样的:
每次我有一个
query组件,它会在我的 我的应用程序中的组件,我是否必须使用getInitialProps确定数据将在服务器端呈现?
我的理解是,getInitialProps 仅适用于页面索引组件(以及 _app.js),这意味着组件树中较低的任何组件都无法访问此生命周期,并且会需要从页面级别向上获取一些初始道具,然后将它们向下传递到组件树。 (如果有人能证实这个假设,那就太好了)
这是我的代码:
_app.js(在/pages 文件夹中)
import App, { Container } from 'next/app';
import { ApolloProvider } from 'react-apollo';
class AppComponent extends App {
static async getInitialProps({ Component, ctx }) {
let pageProps = {};
if (Component.getInitialProps) {
pageProps = await Component.getInitialProps(ctx)
}
// this exposes the query to the user
pageProps.query = ctx.query;
return { pageProps };
}
render() {
const { Component, apollo, pageProps } = this.props;
return (
<Container>
<ApolloProvider client={apollo}>
<Component client={client} {...pageProps} />
</ApolloProvider>
</Container>
);
}
}
export default AppComponent;
Index.js(在/pages/users 文件夹中)
import React, { PureComponent } from 'react';
import { Query } from 'react-apollo';
import gql from 'graphql-tag';
const USERS_QUERY = gql`
query USERS_QUERY {
users {
id
firstName
}
}
`;
class Index extends PureComponent {
render() {
return (
<Query query={USERS_QUERY}>
{({data}) => {
return data.map(user => <div>{user.firstName}</div>);
}}
</Query>
);
}
}
export default Index;
【问题讨论】:
-
一些快速注释,
getInitialProps可以在每个页面上工作,而不仅仅是 index.js。 - 我猜是由 next.js 路由器渲染的任何路由。是的,您需要手动将属性传递到树中,或者使用像React. createContext这样的帮助程序 - 您可以在服务器端解析 graphql 查询,但是,是的,不幸的是,您需要在getInitialProps中手动执行此操作。 -
很遗憾,一团糟。
标签: javascript reactjs graphql next.js isomorphic-javascript