如何在Angular4+中使用Apollo客户端GraphQL
Apollo Client 是灵活的、社区驱动的 GraphQL 客户端,适用于 Angular、JavaScript 和原生平台。 它是从头开始设计的,可以轻松构建使用 GraphQL 获取数据的 UI 组件。 本文是关于如何在 Angular 4+ 中使用 Apollo 客户端 GraphQL 的快速总结。 因此,在阅读以下文章之前,您需要了解 GraphQl 和 Angular 4+。
设置:
在开始运行以下命令之前安装 Angular CLI:
ng add apollo-angular
您需要设置的一件事是 GraphQL 服务器的 URL,因此打开 src/app/graphql.module.ts 并设置 URI 变量:
const uri = 'https://w5xlvm3vzz.lp.gql.zone/graphql'; //our test Graphql Server which returns rates
查询:
我们将使用 Apollo 将 GraphQL 查询结果附加到我们的 Angular UI 元素,我们将使用 Apollo.watchQuery 方法。 我们需要使用 graphql-tag 库将查询解析为 GraphQL 文档。 Apollo.watchQuery 方法需要一个参数,一个带有选项的对象,您可以在同一对象中提供任何可用的选项。 如果您的查询需要变量,这是传递它们的地方:
const currentUser = gql`query currentUser($avatarSize: Int!) {
currentUser {
login
avatar_url(avatarSize: $avatarSize)
}
}`;
@Component({template:`Login: {{currentUser?.profile}}`,})
class UserComponent implements OnInit, OnDestroy {
currentUser: any;
private querySubscription: Subscription;
ngOnInit() {
this.querySubscription = this.apollo.watchQuery({
query: currentUser,
variables: {
avatarSize: 100,
},
}).valueChanges.subscribe(({data}) => {
this.currentUser = data.currentUser;
});
}
ngOnDestroy() {
this.querySubscription.unsubscribe();
}
}
突变:
Apollo 处理 GraphQL 突变。 突变在语法上与查询相同,唯一的区别是您使用关键字突变而不是查询。
GraphQL 突变由两部分组成:
- 带有参数的突变名称,表示要在服务器上执行的实际操作。
- 您希望从突变结果中返回以更新客户端的字段。
我们将使用 mutate 方法。 当我们调用它时,我们可以将选项传递给 mutate:
const submitRepository = gql`mutation submitRepository($repoFullName: String!) {
submitRepository(repoFullName: $repoFullName) {
createdAt
}
}`;
@Component({ ... })
class NewEntryComponent {
constructor(private apollo: Apollo) {}
newRepository() {
this.apollo.mutate({
mutation: submitRepository,
variables: {
repoFullName: 'graphql/angular'
}
}).subscribe(({ data }) => {
console.log('got data', data);
},(error) => {
console.log('there was an error sending the query', error);
});
}
}
乐观回应:
有时在服务器响应结果之前,我们可以预测突变的结果。 例如,当用户对一篇文章发表评论时,我们希望立即在上下文中显示新评论,而无需等待往返服务器的延迟,这就是我们所说的 Optimistic UI。
Apollo Client 为您提供了一种指定 optimisticResponse 选项的方法,该选项将用于立即更新活动查询,就像服务器的突变响应一样。 一旦实际的变异响应返回,乐观的部分将被丢弃并替换为真实的结果。
import { Component } from '@angular/core';
import { Apollo } from 'apollo-angular';
import gql from 'graphql-tag';
const submitComment = gql`mutation submitComment($repoFullName: String!, $commentContent: String!) {
submitComment(repoFullName: $repoFullName, commentContent: $commentContent) {
postedBy {
login
html_url
}
createdAt
content
}
}`;
@Component({ ... })
class CommentPageComponent {
currentUser: User;
constructor(private apollo: Apollo) {}
submit({ repoFullName, commentContent }) {
this.apollo.mutate({
mutation: submitComment,
variables: { repoFullName, commentContent },
optimisticResponse: {
__typename: 'Mutation',
submitComment: {
__typename: 'Comment',
postedBy: this.currentUser,
createdAt: +new Date,
content: commentContent,
},
},
}).subscribe();
}
}
结论
在本文中,我们快速了解了将 Apollo Client GraphQL 与 Angular 结合使用。