发布于 2026-01-06 0 阅读
0

关于 reactjs、Apollo 和 GraphQL 的热爱与情怀(第一部分)DEV 的全球展示与讲述挑战赛,由 Mux 呈现:展示你的项目!

关于 ReactJS、Apollo 和 GraphQL 的热爱与情愫(第一部分)

由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!

💟和愤怒😠往往如此接近。

这是一系列文章,记录了我使用 Apollo、GraphQL 和 Reactjs 开发第一个项目时的感受。此外,你还将学习如何进行配置!

我总是对新鲜事物充满热爱热情。第一次看到 GraphQL 时也是如此。我迫不及待地想学习这门新玩意儿!那是一个阴雨绵绵的周六,我想,这正是开始一个新项目的绝佳时机。

设置

我先从我的老朋友开始create-react-app


npx create-react-app react-apollo

#or

yarn create react-app react-apollo

很简单。你已经有了 React 前端。现在切换目录并启动前端。

cd react-apollo

yarn start

#or

npm start

让我们在前端添加 Apollo 和 GraphQL。
在谷歌上搜索了一番之后,我找到了apollo-boost……。
README.md看起来不错,所以我就安装了它。

npm I apollo-boost graphql react-apollo -S

#or

yarn add apollo-boost graphql react-apollo

好的,看起来不错。就是一个 Boost 包、一个基础 GraphQL 包和一个 React 集成包。简洁!

创建 Apollo 客户端

让我们来设置一下,也就是创建一个 Apollo 客户端。所以README.md建议使用以下代码。

import React from 'react';
import { render } from 'react-dom';
import ApolloClient from 'apollo-boost';
import { ApolloProvider } from 'react-apollo';

// Pass your GraphQL endpoint to uri
const client = new ApolloClient({ uri: 'https://nx9zvp49q7.lp.gql.zone/graphql' });

const ApolloApp = AppComponent => (
  <ApolloProvider client={client}>
    <AppComponent />
  </ApolloProvider>
);

render(ApolloApp(App), document.getElementById('root'));

看完这段代码后,我eslint发现了三个问题🤔。`is`App没有被导入,而且render()渲染到了根目录。好吧,这里不能直接复制粘贴create-react-app,而且我们目前也没有 Apollo 的端点😩。谷歌再次拯救了我🙏。搜索后,open graphql endpoints我找到了宝可梦的端点!太好了。URI 是https://graphql-pokemon.now.sh`.`

好了,第一个问题解决了。让我们开始改变我们的create-react-app……

src/apollo.jsx首先,创建一个包含以下代码的文件。

import React from 'react';
import ApolloClient from 'apollo-boost';
import { ApolloProvider } from 'react-apollo';

// Pass your GraphQL endpoint to uri
const client = new ApolloClient({ uri: 'https://graphql-pokemon.now.sh/' });

export default AppComponent => (
  <ApolloProvider client={client}>
    <AppComponent />
  </ApolloProvider>
);

现在修改你的 index.js 文件,使其内容如下所示:

import { render } from 'react-dom';
import './index.css';
import ApolloApp from './apollo';
import App from './App';
import * as serviceWorker from './serviceWorker';

render(ApolloApp(App), document.getElementById('root'));
serviceWorker.unregister();

我们导入ApolloApp并封装了它AppApolloApp是的,命名确实不太好。保存并检查一切是否仍然正常!看看终端是否localhost:3000运行正常😊。

我们的第一个查询

宝可梦 GraphQL 接口功能非常有限,我们只能通过名称或 ID 进行查询😯。
创建一个文件src/PokemonByName.js并添加以下代码。

import React from 'react';
import { gql } from 'apollo-boost';
import { Query } from 'react-apollo';

const GET_POKEMON = gql`
query pokemon($name: String!)  {
  pokemon(name: $name) {
    id
    number
    name
  }
}
`
export default ({ name }) => (
  <Query query={GET_POKEMON} variables={{ name }}>
    {({ loading, error, data }) => {
      if (loading) return null;
      if (error) return `Error!: ${error}`;
      if(!!data.pokemon){
        return (
          <div>
            {data.pokemon.name} {data.pokemon.number}
          </div>
        );
      }
      return (
        <div>
          {name} not Found
        </div>
      );
    }}
  </Query>
);

😵 哇,代码好多啊!我们正在创建一个名为 GET_POKEMON 的查询。`GraphQL`gql是一种模板语言。`name`$name是一个类型为 `Pokemon` 的变量String,它是必需的。之所以是必需的,是因为这里有一个 `Pokemon` 对象!。该查询将返回一个包含宝可梦内部 ID、图鉴编号和名称的对象。我们还创建了一个组件,用于实际发送 GraphQL 查询。我们将宝可梦的名称作为 prop 传递。如果页面仍在加载,则不会渲染任何内容。如果出现错误,我们会渲染一个错误信息,然后检查是否找到了宝可梦。如果找到了,则渲染名称和编号;如果没有找到,则渲染一条消息,提示未找到具有该名称的宝可梦。

让我们实际操作一下,让屏幕上能显示一些东西!
所以请将文件更改src/app.js为以下内容。

import React, { Fragment } from 'react';
import PokemonByName from './PokemonByName';

import './App.css';

const App = () => (
  <Fragment>
    <PokemonByName name={'pikachu'} />
    <PokemonByName name={'charmander'} />
    <PokemonByName name={'bulbasaur'} />
  </Fragment>
)

export default App;

我们正在导入新组件,然后将其添加到 App 组件中三次。现在保存所有内容,看看浏览器是如何渲染屏幕上的宝可梦的!太漂亮了😍!

现在我们知道如何将 GraphQL 端点集成到我们的应用程序中了。

下次我们将尝试创建自己的 GraphQL 端点!我很好奇结果会如何(或者是否成功)。

感谢阅读!

哈喽! Instagram | Twitter | LinkedIn | Medium

文章来源:https://dev.to/lampewebdev/love-and-affection-about-reactjs-apollo-and-graphql-part-1-51fg