如何在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 突变由两部分组成:

  1. 带有参数的突变名称,表示要在服务器上执行的实际操作。
  2. 您希望从突变结果中返回以更新客户端的字段。

我们将使用 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 结合使用。