Mar*_*oss 8 reactjs graphql strapi react-apollo next.js
在我的应用程序中,我使用以下NPM 模块来使用Strapi、GraphQL和Next.js:
在下一步中,我将创建 Apollo 配置文件,示例如下:
import { HttpLink } from "apollo-link-http";
import { withData } from "next-apollo";
const config = {
link: new HttpLink({
uri: "http://localhost:1337/graphql",
})
};
export default withData(config);
Run Code Online (Sandbox Code Playgroud)
然后在类组件中,我使用静态方法getInitialProps()通过 GraphQL 查询从 Strapi 获取数据。
一切都很好,但也许有另一种更好的方式通过 React 钩子或任何其他方式?
我为 Next.js 和 GraphQL 找到了一个更好的钩子解决方案。
我想和你分享。开始吧。
注意:我假设您已经安装了 Next.js 应用程序。如果没有,请遵循本指南。
为了构建这个解决方案,我们需要:
1.运行npm命令:
npm install --save @apollo/react-hooks apollo-cache-inmemory apollo-client apollo-link-http graphql graphql-tag isomorphic-unfetch next-with-apollo
Run Code Online (Sandbox Code Playgroud)
2.创建Appolo配置文件,例如。文件夹中./config并调用它appollo.js。文件代码如下:
import { ApolloClient } from "apollo-client";
import { InMemoryCache } from "apollo-cache-inmemory";
import withApollo from "next-with-apollo";
import { createHttpLink } from "apollo-link-http";
import fetch from "isomorphic-unfetch";
const GRAPHQL_URL = process.env.BACKEND_URL || "https://api.graphql.url";
const link = createHttpLink({
fetch,
uri: GRAPHQL_URL
});
export default withApollo(
({ initialState }) =>
new ApolloClient({
link: link,
cache: new InMemoryCache()
.restore(initialState || {})
})
);
Run Code Online (Sandbox Code Playgroud)
3.使用以下代码在文件夹中创建_app.js文件(一种包装器)./pages:
import React from "react";
import Head from "next/head";
import { ApolloProvider } from "@apollo/react-hooks";
import withData from "../config/apollo";
const App = ({ Component, pageProps, apollo }) => {
return (
<ApolloProvider client={apollo}>
<Head>
<title>App Title</title>
</Head>
<Component {...pageProps} />
</ApolloProvider>
)
};
export default withData(App);
Run Code Online (Sandbox Code Playgroud)
4.创建可重用的查询组件,例如。./components/query.js
import React from "react";
import { useQuery } from "@apollo/react-hooks";
const Query = ({ children, query, id }) => {
const { data, loading, error } = useQuery(query, {
variables: { id: id }
});
if (loading) return <p>Loading...</p>;
if (error) return <p>Error: {JSON.stringify(error)}</p>;
return children({ data });
};
export default Query;
Run Code Online (Sandbox Code Playgroud)
5.为通过 GraphQL 获取的数据创建一个组件
import React from "react";
import Query from "../components/query";
import GRAPHQL_TEST_QUERY from "../queries/test-query";
const Example = () => {
return (
<div>
<Query query={GRAPHQL_TEST_QUERY} id={null}>
{({ data: { graphqlData } }) => {
return (
<div>
{graphqlData.map((fetchedItem, i) => {
return (
<div key={fetchedItem.id}>
{fetchedItem.name}
</div>
);
})}
</div>
);
}}
</Query>
</div>
);
};
export default Example;
Run Code Online (Sandbox Code Playgroud)
6.在里面创建我们的 GraphQL 查询./queries/test-query。注意:我假设我们可以通过 GraphQL访问示例数据和id属性name
import gql from "graphql-tag";
const GRAPHQL_TEST_QUERY = gql`
query graphQLData {
exampleTypeOfData {
id
name
}
}
`;
export default GRAPHQL_TEST_QUERY;
Run Code Online (Sandbox Code Playgroud)
7.要显示我们的结果,请使用以下代码index.js在文件夹中创建文件(主页) :./pages
import Example from './components/example';
const Index = () => <div><Example /></div>
export default Index;
Run Code Online (Sandbox Code Playgroud)
就这样..根据需要享受并扩展这个解决方案..
| 归档时间: |
|
| 查看次数: |
2586 次 |
| 最近记录: |