Skip to content
♻️ React integration for Apollo Client
Branch: master
Clone or download
MerzDaniel and hwillson Add test for Query bug which is caused by changing props (#1749) (#2718)
* Add test for Query bug which is caused by changing props (#1749)

* Skip the failing test (#1749)

* Enable failing test

* Leverage lastResult to limit unnecessary subscription re-creation

When the Observable subscription created in `startQuerySubcription`
receives an error, we only want to remove the old subscription,
and start a new subscription, when we don't have a
previous result stored. So if no previous result was received due to
problems fetching data, or the previous result has been forcefully
cleared out for some reason, we shoule re-create a new
subscription. Otherwise we might be unnecessarily starting a new
subscription the `Query` component isn't expecting, and isn't tying
into its update cycle properly.

* Changelog update
Latest commit 5e963a4 Mar 15, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci Bring back react-apollo/react-apollo.umd.js. Jan 31, 2019
.github Set GH CODEOWNERS and update the README (#2625) Nov 27, 2018
examples chore(deps): update dependency rollup to v1.6.0 (#2864) Mar 15, 2019
scripts Use lib/react-apollo.cjs.js as "main" entry point in package.json. Jan 31, 2019
src Add test for Query bug which is caused by changing props (#1749) (#2718) Mar 15, 2019
test Add test for Query bug which is caused by changing props (#1749) (#2718) Mar 15, 2019
.gitignore Provide esm bundle (#2677) Jan 20, 2019
.npmignore Package now consists of ES2015 and commonjs (#1576) Jan 25, 2018
.prettierignore clean up formatting and force it everywhere (#1698) Feb 22, 2018
COLLABORATORS.md Add collaborator docs (#2760) Jan 29, 2019
CONTRIBUTING.md Browser (#1578) Jan 25, 2018
Changelog.md Add test for Query bug which is caused by changing props (#1749) (#2718) Mar 15, 2019
LICENSE Intial build (#1) Apr 16, 2016
README.md Remove broken (and unnecessary) recipes section from the README Mar 15, 2019
ROADMAP.md clean up formatting and force it everywhere (#1698) Feb 22, 2018
dangerfile.ts Remove `allowSyntheticDefaultImports` use (#2438) Sep 29, 2018
jest.cjs.config.js Use lib/react-apollo.cjs.js as "main" entry point in package.json. Jan 31, 2019
jest.preact.config.json Remove remnant from flow - out of date and unused (#2696) Dec 27, 2018
jest.umd.config.js Bring back react-apollo/react-apollo.umd.js. Jan 31, 2019
package-lock.json Merge remote-tracking branch 'upstream/master' into support_react_cre… Mar 15, 2019
package.json Bump bundlesize threshold Mar 15, 2019
renovate.json Switch renovate assignee/reviwer to @hwillson Sep 19, 2018
rollup.config.js `create-react-context` is no longer used, so remove from rollup Mar 15, 2019
tsconfig.cjs.json Provide esm bundle (#2677) Jan 20, 2019
tsconfig.json Compile only ./src via tsc to simplify `npm run compile`. Jan 28, 2019
tslint.json clean up formatting and force it everywhere (#1698) Feb 22, 2018

README.md

React Apollo npm version Get on Slack

React Apollo allows you to fetch data from your GraphQL server and use it in building complex and reactive UIs using the React framework. React Apollo may be used in any context that React may be used. In the browser, in React Native, or in Node.js when you want to do server-side rendering.

React Apollo unlike many other tools in the React ecosystem requires no complex build setup to get up and running. As long as you have a GraphQL server you can get started building out your application with React immediately. React Apollo works out of the box with both create-react-app and React Native with a single install and with no extra hassle configuring Babel or other JavaScript tools.

React Apollo is:

  1. Incrementally adoptable, so that you can drop it into an existing JavaScript app and start using GraphQL for just part of your UI.
  2. Universally compatible, so that Apollo works with any build setup, any GraphQL server, and any GraphQL schema.
  3. Simple to get started with, you can start loading data right away and learn about advanced features later.
  4. Inspectable and understandable, so that you can have great developer tools to understand exactly what is happening in your app.
  5. Built for interactive apps, so your users can make changes and see them reflected in the UI immediately.
  6. Small and flexible, so you don't get stuff you don't need. The core is under 25kb compressed.
  7. Community driven, Apollo is driven by the community and serves a variety of use cases. Everything is planned and developed in the open.

Get started today on the app you’ve been dreaming of, and let React Apollo take you to the moon!

Installation

It is simple to install React Apollo and related libraries

# installing the preset package (apollo-boost) and react integration
npm install apollo-boost react-apollo graphql-tag graphql --save

# installing each piece independently
npm install apollo-client apollo-cache-inmemory apollo-link-http react-apollo graphql-tag graphql --save

apollo-boost is a minimal config way to start using Apollo Client. It includes some sensible defaults, such as InMemoryCache and HttpLink.

That’s it! You may now use React Apollo in any of your React environments.

For an amazing developer experience you may also install the Apollo Client Developer tools for Chrome which will give you inspectability into your React Apollo data.

Usage

Looking for apollo 1.x docs? See here.

To get started you will first want to create an instance of ApolloClient and then you will want to provide that client to your React component tree using the <ApolloProvider/> component. Finally, we will show you a basic example of connecting your GraphQL data to your React components with the <Query> component.

First we want an instance of ApolloClient. We can import the class from apollo-client. To get started, create an ApolloClient instance and point it at your GraphQL server:

import { ApolloClient } from 'apollo-client';
import { HttpLink } from 'apollo-link-http';
import { InMemoryCache } from 'apollo-cache-inmemory';

const client = new ApolloClient({
  // By default, this client will send queries to the
  //  `/graphql` endpoint on the same host
  // Pass the configuration option { uri: YOUR_GRAPHQL_API_URL } to the `HttpLink` to connect
  // to a different host
  link: new HttpLink(),
  cache: new InMemoryCache(),
});

If you're using apollo-boost, you can create an ApolloClient that uses HttpLink and InMemoryCache like so:

import ApolloClient from 'apollo-boost';

const client = new ApolloClient();

Migrating from 1.x? See the 2.0 migration guide.

Next you will want to add a <ApolloProvider/> component to the root of your React component tree. This component provides the React Apollo functionality to all the other components in the application without passing it explicitly. To use an <ApolloProvider/> with your newly constructed client see the following:

import { ApolloProvider } from 'react-apollo';

ReactDOM.render(
  <ApolloProvider client={client}>
    <MyRootComponent />
  </ApolloProvider>,
  document.getElementById('root'),
);

Now you may create components in this React tree that are connected to your GraphQL API.

Finally, to demonstrate the power of React Apollo in building interactive UIs let us connect one of your components to your GraphQL server using the <Query> component:

You'll need install graphql-tag to use gql module:

npm install graphql-tag --save
import gql from 'graphql-tag';
import { Query } from 'react-apollo';

const GET_DOGS = gql`
  {
    dogs {
      id
      breed
    }
  }
`;

const Dogs = ({ onDogSelected }) => (
  <Query query={GET_DOGS}>
    {({ loading, error, data }) => {
      if (loading) return 'Loading...';
      if (error) return `Error! ${error.message}`;

      return (
        <select name="dog" onChange={onDogSelected}>
          {data.dogs.map(dog => (
            <option key={dog.id} value={dog.breed}>
              {dog.breed}
            </option>
          ))}
        </select>
      );
    }}
  </Query>
);

If you render Dogs within your App component, you’ll first see a loading state and then a form with a list of dog breeds once Apollo Client receives the data from the server.

To learn more about querying with React Apollo be sure to start reading the documentation article on Queries. If you would like to see all of the features React Apollo supports be sure to check out the complete API reference.

Polyfills

React Apollo makes use of Object.assign, which is not supported in certain browsers (most prominently, IE11). If you wish to support legacy browsers, you will need to import a polyfill. As an example, you could use core-js's polyfill like so:

import 'core-js/fn/object/assign';

Building for production

The react-apollo package is designed to be effectively consumed by bundlers that understand either CommonJS require syntax or ECMASCript import and export syntax, such as Rollup, Webpack, or Parcel. If your bundler supports tree-shaking, it should be able to eliminate unused code from the react-apollo package, regardless of which module syntax you're using.

You should (almost) never need to reach into the react-apollo/... internals to import specific modules. The only supported exceptions are react-apollo/test-links, react-apollo/test-utils, and react-apollo/walkTree (deprecated).

When minifying your application, you can make the react-apollo package noticeably smaller by configuring your minifier to replace the expression process.env.NODE_ENV with a string literal (typically "production"). Other packages such as React use the same convention, so there's a good chance you already have your minifier configured in this way.

Documentation

For a complete React Apollo API reference visit the documentation website at: https://www.apollographql.com/docs/react/api/react-apollo.html

All of the documentation for React Apollo including usage articles and helpful recipes lives on: https://www.apollographql.com/docs/react/

Maintainers

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.