全栈 React + GraphQL 教程(一)
首发于众成翻译 Part 1——前端:使用 Apollo 声明式地请求和 mock 数据
GraphQL 是一种新的 API 定义和查询语言,有可能成为新的 REST。它使 UI 组件易于声明式地获取数据,而不必关注后端实现细节。GraphQL 作为一种强大的抽象,可以加快应用开发速度,使代码更容易维护。 然而,尽管使用 GraphQL 有诸多好处,但迈出第一步可能并不容易。这就是为什么我编写了这一系列教程,带你一步步地编写一个包含 GraphQL 和 Apollo Client 的全栈 React 应用。该系列将引导你完整构建一个使用 GraphQL 的即时消息应用:
本教程——作为这一系列中的第一篇——是关于如何在前端开始使用 GraphQL。只需要大约20-30分钟,最终你会得到一个非常简单的 React UI,它使用 GraphQL 加载数据,看起来像这样:
一个使用 GraphQL 加载数据的简易 React UI 让我们开始吧! 1. 环境搭建
我们将在本教程中使用 > npm install -g create-react-app 我们还需要从 GitHub 中克隆本教程的代码库,其中包含了我们稍后会使用到的 CSS 和图像。 > git clone https://github.com/apollographql/graphql-tutorial.git > cd graphql-tutorial 接下来,我们使用 > create-react-app client > cd client 为了确保它能工作,我们启动服务器: > npm start 如果一切正常,你现在应该在浏览器中看到如下内容:
2. 编写第一个组件由于我们正在使用 Apollo 构建一个应用,所以我们通过从 > cd src > cp ../../resources/* . 为了简化初始教程,我们今天只构建一个简单的列表视图。让我们修改
现在你的 import React,{ Component } from 'react'; import logo from './logo.svg'; import './App.css'; const ChannelsList = () => (<ul> <li>Channel 1</li> <li>Channel 2</li> </ul>); class App extends Component { render() { return ( <div className="App"> <div className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <h2>Welcome to Apollo</h2> </div> <ChannelsList /> </div> ); } } export default App;
如果看起来像这样,你的设置就是正确的。 3. 编写你的 GraphQL schema现在我们有一个简单的应用正在运行,现在是为它编写 GraphQL 类型定义的时候了。 Schema 将指定我们的应用中存在哪些对象类型,以及它们有哪些字段。此外,它指定了我们的 API 的入口。我们新建一个名为 export const typeDefs = ` type Channel { id: ID! # "!" 为必填 name: String } # 此类型指定了我们的 API 的入口点。在本例中,只有一个——"channels"——返回频道列表。 type Query { channels: [Channel] # "[]" 意味着这是频道列表 } `; 有了这个 schema,我们可以在下节中编写一个简单的查询来获取我们的 query ChannelsListQuery { channels { id name } } 4. 将你的组件连接 GraphQL 查询好,现在我们有了 schema 和查询,我们只需要使用 Apollo Client 连接我们的组件!我们来安装 Apollo Client 和一些辅助软件包,我们需要将 GraphQL 添加到我们的应用中: > npm i -S react-apollo
现在,我们在 import { ApolloClient,gql,graphql,ApolloProvider,} from 'react-apollo'; const client = new ApolloClient(); 接下来,我们使用 GraphQL 高阶组件来装饰原来的 const channelsListQuery = gql` query ChannelsListQuery { channels { id name } } `; const ChannelsListWithData = graphql(channelsListQuery)(ChannelsList); 当我们的 接下来修改我们的 const ChannelsList = ({ data: {loading,error,channels }}) => { if (loading) { return <p>Loading ...</p>; } if (error) { return <p>{error.message}</p>; } return <ul> { channels.map( ch => <li key={ch.id}>{ch.name}</li> ) } </ul>; }; 最后,我们用 现在你的 class App extends Component { render() { return ( <ApolloProvider client={client}> <div className="App"> <div className="App-header"> <img src={logo} className="App-logo" alt="logo" /> <h2>Welcome to Apollo</h2> </div> <ChannelsListWithData /> </div> </ApolloProvider> ); } } 好的,我们快完成了!如果你现在尝试运行,应该会看到以下错误:
起作用了!——好吧,至少部分如此。 这是怎么回事?尽管我们正确地连接了所有的组件,但我们还没有写一个服务器,所以当然没有数据可以获取或显示! 如果你没有为 GraphQL 端点指定 URL,Apollo Client 将假定它运行在同一个域下的 但是,由于本教程不是关于编写服务器的,所以我们将利用 GraphQL 代码即文档这一特性,根据我们先前写过的类型定义自动创建 mock。要实现这一点,我们只需要停止服务器,安装一些其他的软件包,然后重新启动它: npm i -S graphql-tools apollo-test-utils graphql 我们将使用这些软件包根据我们前面写的 schema 为 Apollo Client 创建一个模拟网络接口。将以下导入和定义添加到 import { makeExecutableSchema,addMockFunctionsToSchema } from 'graphql-tools'; import { mockNetworkInterfaceWithSchema } from 'apollo-test-utils'; import { typeDefs } from './schema'; const schema = makeExecutableSchema({ typeDefs }); addMockFunctionsToSchema({ schema }); const mockNetworkInterface = mockNetworkInterfaceWithSchema({ schema }); 现在你只需将 const client = new ApolloClient({ networkInterface: mockNetworkInterface,}); 就是这样,你已经完成了!你的屏幕现在应该如下所示:
我们做到了,我们的第一个使用 Apollo 的 React + GraphQL 应用!
如果某些代码不起作用,并且你搞不清是为什么,你可以将其与此文件进行比较,以发现代码差异。或者,你可以查看 恭喜,你已经正式完成了教程的第一部分!可能没什么感觉,但实际上已经做了很多工作:你已经编写了一个 GraphQL schema,从中生成模拟数据,并将 GraphQL 查询与 React 组件相连。在本教程的其余部分中,你将了解到我们构建一个真正的通信应用的基础。在第2部分中,我们将编写一个简单的服务器并将其连接到我们的应用! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |