import { Head, Image } from "mdx-deck" import nightOwl from "prism-react-renderer/themes/nightOwl" import { CodeSurfer } from "mdx-deck-code-surfer" import { LayoutNoFooter, Layout, Split, BGImage } from "./components/index" import { default as foo } from "./components/index"
export { components } from "mdx-deck-code-surfer" export const theme = { ...foo, codeSurfer: { ...nightOwl, showNumbers: false } }
export default Layout
<title>GraphQL + Apollo + Vue = Magic</title>export default LayoutNoFooter
export default Layout
export default Split
export default Layout
export default Split
- Developer Advocate at YLD
- Really into shitty movies
- Really into football
export default Layout
export default Layout
export default Layout
export default LayoutNoFooter
export default Layout
export default Layout
export default LayoutNoFooter
export default LayoutNoFooter
export default Layout
npm i vue-apollo apollo-boost graphql
# yarn add vue-apollo apollo-boost graphql
import Vue from "vue"
import App from "./App"
import ApolloClient from "apollo-boost"
import VueApollo from "vue-apollo"
const apolloProvider = new VueApollo({
defaultClient: new ApolloClient({
uri: "https://api.graphcms.com/simple/v1/awesomeTalksClone"
})
})
Vue.use(VueApollo)
new Vue({
el: "#app",
provide: apolloProvider.provide(),
render: h => h(App)
})
----
*
3 > Import the Apollo Client
4 > Import Vue Apollo for using Apollo with vue
6:10 > Create the provider and give it the URL
13:17 > Mount Vue
export default Layout
export default Layout
export default LayoutNoFooter
import { gql } from "apollo-boost"
export default gql`
query allSpeakers {
allSpeakers {
id
name
photo {
url
}
}
}
`
export default Layout
<template>
<ApolloQuery :query="require('../queries/SPEAKERS.gql').default">
<template slot-scope="{ result: { loading, error, data } }">
<h3 v-if="loading"> Loading </h3>
<h3 v-if="error"> Oh No :( </h3>
<ul v-if="data.allSpeakers.length">
<li v-for="s in data.allSpeakers" :key="s.id">
<img :src="s.photo.url" :alt="s.name" />
{{s.name}}
</li>
</ul>
<section v-else class="empty">
No Speakers
</section>
</template>
</ApolloQuery>
</template>
----
*
2, 16 > Import the query
export default Layout
<CodeSurfer
theme={nightOwl}
lang="javascript"
code={ import { gql } from "apollo-boost" \n export default gql\
query allSpeakers($name: String) {
allSpeakers(filter: { name_contains: $name }) {
id
name
photo {
url
}
}
}
`
`}
/>
<CodeSurfer
theme={nightOwl}
lang="markup"
steps={[
{ lines: [4], notes: "Add an input with a v-model" },
{ lines: [6], notes: "Import Query" },
{ lines: [7], notes: "Set the variables" }
]}
code={<template> <main> <input type="text" placeholder="Search them names" v-model="search" /> <ApolloQuery :query="require('../queries/SPEAKERS.gql').default" :variables="{ name: search }"> <template slot-scope="{ result: { loading, error, data } }"> <h3 v-if="loading"> Loading </h3> <h3 v-if="error"> Oh No :( </h3> <ul v-if="data.allSpeakers.length"> <li v-for="s in data.allSpeakers" :key="s.id"> <img :src="s.photo.url" :alt="s.name" /> {{s.name}} </li> </ul> <section v-else class="empty"> No Speakers match your search </section> </template> </ApolloQuery> </main> </template>
}
/>
export default Layout
export default Layout
<CodeSurfer
theme={nightOwl}
lang="javascript"
code={ import { gql } from "apollo-boost" \n export default gql\
mutation createSpeaker($name: String!) {
createSpeakers(name: $name) {
id
name
}
}
`
`}
/>
<CodeSurfer
theme={nightOwl}
lang="markup"
steps={[
{ lines: [4], notes: "Import Mutation" },
{ lines: [5, 10], notes: "Set the variables" },
{ lines: [9], notes: "Run the mutation function on submit" }
]}
code={<template> <ApolloMutation :mutation=โrequire('../queries/ADD_SPEAKER.gql').default" :variables="{ name }โ :update=โonUpdate" > <template slot-scope="{ mutate, loading, error }"> <form @submit.prevent="mutate"> <input type="text" placeholder=โName" v-model="name" /> <button type="submit">Add Speaker</button> <h3 v-if="error">Failed</h3> <h3 v-if="loading">Loading</h3> </form> </template> </ApolloMutation> </template>
}
/>
export default Layout
<CodeSurfer
theme={nightOwl}
lang="javascript"
code={methods: { onUpdate(cache, { data: { createSpeaker }}) { const { allSpeakers } = cache.readQuery({ query: SPEAKERS }) cache.writeQuery({ query: SPEAKERS, data: { allSpeakers: allSpeakers.concat({ ... createSpeaker, photo: { url: 'http://placekitten.com/100/100', __typename: 'Assets', }, }), }, }) }, }
}
/>
export default LayoutNoFooter
export default LayoutNoFooter