我有一个使用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;