Frontend
Client
As well as with the server there are several clients for GraphQL within different languages and frameworks, visit the official page to check them out.
We are going to use Apollo Client so for that we need to install apollo and graphql on the client side of our application:
$ npm install @apollo/client graphql
In our case we are going to connect our client to React (Reference). So, first we import the necessary modules.
import React from "react";
import { render } from "react-dom";
import {
ApolloClient,
InMemoryCache,
ApolloProvider,
useQuery,
gql,
} from "@apollo/client";
const client = new ApolloClient({
uri: "http://localhost:4000",
cache: new InMemoryCache(),
});
function App() {
return (
<div>
<h2>My first Apollo app 🚀</h2>
</div>
);
}
render(
<ApolloProvider client={client}>
{" "}
<App />{" "}
</ApolloProvider>,
document.getElementById("root")
);We tell apollo that our GraphQL server is listening for request on our localhost on the port 4000.
Where apollo allows us to cache our queries, with the InMemoryCache module. That way we do not need to make the same request twice, because the data is cached in memory.
And then, we wrap our app with the ApolloProvider, so all of our components have access to our client. Note that we pass our client as a prop.
Fetch Data
Variables
In order to make a query by passing parameters we do:
const ANIMAL_QUERY = gql`
query ($slug: String!) {
animal(slug: $slug) {
title
image
stock
description
price
}
}
`;Where $string is the variable we want to pass in, and we specify its type and the fact that it is required with String!.
Now to make the query we do:
function AnimalPage() {
const { slug } = useParameters()
const { loading, data, error } = useQuery(
variables: {
slug: 'cat'
}
)
}With variables we pass in all of the parameters needed in the query.
Mutations
In order to execute a mutation from the client side we create a mutation request:
const ADD_ANIMAL_MUTATION = gql`
mutation (
$name: String!
$description: [String!]
$parameter: String!
$category: String!
) {
addAnimal(
name: $name
description: $description
parameter: $parameter
category: $category
)
}
`;And now we use the useMutation hook to obtain the function that will be called in order to update our animal:
import { useMutation, gql } from "@apollo/client";
function Animal() {
const [addAnimal] = useMutation(ADD_ANIMAL_MUTATION);
return (
<div>
<button
onClick={() =>
addAnimal({
variables: {
name: "cat",
description: ["This is a description"],
parameter: "cat",
category: "mammal",
},
})
}
/>
</div>
);
}With this we get the function addAnimal with the useMutation hook and we use it in our button, so when it is clicked we add a cat to our animal collection.