• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > react-apollo入门教程

react-apollo入门教程

作者:LXIBEI的博客 字体:[增加 减小] 来源:互联网 时间:2017-08-24

LXIBEI的博客通过本文主要向大家介绍了apollo,react,数据等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

官网

1.简介

react-apollo是Apollo数据栈在React环境的集成包之一,要在React里使用Apollo数据栈前端至少需要三个包:apollo-client、graphql-tag和react-apollo,apollo-client用于连接到Apollo后端,graphql-tag用于编写GraphQL查询,react-apollo用于执行GraphQL查询并将结果传给React的展示组件。

2.创建client

//默认client会将url设为 `/graphql`
import { ApolloClient } from 'react-apollo';
const client = new ApolloClient();
//当你需要改变graphql server的url的时候,需使用networkInterface
import { ApolloClient, createNetworkInterface } from 'react-apollo';
const networkInterface = createNetworkInterface({
  uri: 'http://api.example.com/graphql'
});
const client = new ApolloClient({
  networkInterface: networkInterface
);

3.创建provider,用于连接client和component

import { ApolloClient, ApolloProvider } from 'react-apollo';
const client = new ApolloClient();
ReactDOM.render(
  <ApolloProvider client={client}>
    <MyAppComponent />
  </ApolloProvider>,
  document.getElementById('root')
)

4.使用

(1)Queries

1.1基本查询

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { graphql } from 'react-apollo';
import gql from 'graphql-tag';
class Profile extends Component { ... }
// We use the gql tag to parse our query string into a query document
const CurrentUserForLayout = gql`
  query CurrentUserForLayout {
    currentUser {
      login
      avatar_url
    }
  }
`;
const ProfileWithData = graphql(CurrentUserForLayout)(Profile)

1.2 参数查询

const CurrentUserForLayout = gql`
  query CurrentUserForLayout($avatarSize: Int!) {
    currentUser {
      login
      avatar_url(avatarSize: $avatarSize)
    }
  }
`;
const ProfileWithData = graphql(CurrentUserForLayout, {
  options: { variables: { avatarSize: 100 } },
})(Profile);

(2)Mutation

2.1基本修改

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { gql, graphql } from 'react-apollo';
class NewEntry extends Component { ... }
const submitRepository = gql`
  mutation submitRepository {
    submitRepository(repoFullName: "apollographql/apollo-client") {
      createdAt
    }
  }
`;
const NewEntryWithData = graphql(submitRepository)(NewEntry);

2.2传参修改

//被包裹的组件会传递一个mutate作为props传递过去,可以用来传递mutation操作参数,如:
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { gql, graphql } from 'react-apollo';
class NewEntry extends Component {
  onClick() {
    this.props.mutate({
      variables: { repoFullName: 'apollographql/apollo-client' }
    })
      .then(({ data }) => {
        console.log('got data', data);
      }).catch((error) => {
        console.log('there was an error sending the query', error);
      });
  }
  render() {
    return <div onClick={this.onClick.bind(this)}>Click me</div>;
  }
}
const submitRepository = gql`
  mutation submitRepository($repoFullName: String!) {
    submitRepository(repoFullName: $repoFullName) {
      createdAt
    }
  }
`;
const NewEntryWithData = graphql(submitRepository)(NewEntry);

//也可以对mutate根据需要进行自己的函数封装
const NewEntryWithData = graphql(submitRepository, {
  props: ({ mutate }) => ({
    submit: (repoFullName) => mutate({ variables: { repoFullName } }),
  }),
})(NewEntry);

//这时在component中可直接调用submit
const NewEntry = ({ submit }) => (
  <div onClick={() => submit('apollographql/apollo-client')}>
    Click me
  </div>
);

(3)使用compose

很多时候我们的页面中存在多个queries和mutation操作,这时候我们需要使用compose来进行组合

import { compose } from 'react-apollo';
const ComponentWithMutations = compose(
  graphql(submitNewUser, { name: 'newUserMutation' }),
  graphql(submitRepository, { name: 'newRepositoryMutation' })
)(Component);

5.执行Mutation后进行状态更新

5.1 refetchQueries

refetchQueries是用来更新缓存的简单方法,当你在执行完一次mutation操作后,可能会有一个或多个状态被影响,这时可以指定一个或多个需要执行的queries来刷新这部分store
mutate({
  //... insert comment mutation
  refetchQueries: [{
    query: gql`
      query updateCache($repoName: String!) {
        entry(repoFullName: $repoName) {
          id
          comments {
            postedBy {
              login
              html_url
            }
            createdAt
            content
          }
        }
      }
    `,
    variables: { repoFullName: 'apollographql/apollo-client' },
  }],
})

5.2 update

import CommentAppQuery from '../queries/CommentAppQuery';
const SUBMIT_COMMENT_MUTATION = gql`
  mutation submitComment($repoFullName: String!, $commentContent: String!) {
    submitComment(repoFullName: $repoFullName, commentContent: $commentContent) {
      postedBy {
        login
        html_url
      }
      createdAt
      content
    }
  }
`;
const CommentsPageWithMutations = graphql(SUBMIT_COMMENT_MUTATION, {
  props({ ownProps, mutate }) {
    return {
      submit({ repoFullName, commentContent }) {
        return mutate({
          variables: { repoFullName, commentContent },
          update: (store, { data: { submitComment } }) => {
            // 从CommentAppQuery 中读取出查询得到的缓存数据
            const data = store.readQuery({ query: CommentAppQuery });
           // 将mutation的结果放入查询得到的数据中
            data.comments.push(submitComment);
            // 将数据重新写入缓存中,实现数据的更新            
            store.writeQuery({ query: CommentAppQuery, data });         
          },
        });
      },
    };
  },
})(CommentsPage);
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • react-apollo入门教程

相关文章

  • 2017-05-28详解Spring Boot实现日志记录 SLF4J
  • 2017-05-28SpringBoot整合ElasticSearch实践
  • 2017-05-28Spring Boot 使用Druid详解
  • 2017-05-28Java多线程并发编程(互斥锁Reentrant Lock)
  • 2017-05-28Java用 Rhino/Nashorn 代替第三方 JSON 转换库
  • 2017-05-28Java Socket编程(二) Java面向连接的类
  • 2017-05-28Java 关键字static详解及实例代码
  • 2017-05-28CentOS安装solr 4.10.3详细教程
  • 2017-05-28mybatis自动生成时如何设置不生成Example类详解
  • 2017-05-28Spring+SpringMVC+MyBatis深入学习及搭建(一)之MyBatis的基础知识

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Java语言实现简单FTP软件 辅助功能模块FTP站点管理实现(12)
    • [译]深入字节码操作:使用ASM和Javassist创建审核日志
    • java回调机制实例详解
    • JavaEE开发之SpringMVC中的自定义消息转换器与文件上传
    • response.setHeader各种用法详解
    • SpringMVC表单标签使用详解
    • Java数据结构与算法之选择排序(动力节点java学院整理)
    • 详解spring Boot Cli的配置和使用
    • Spring Boot 之HelloWorld开发案例
    • 详谈Lock与synchronized 的区别

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有