GraphQL实际篇之Vue+GraphQL搭建客户端
上一篇咱们介绍了应用Nestjs+GraphQL搭建服务端,这篇文章记录应用Vue+GraphQL搭建客户端。
客户端我的项目目录构造如下:
装置
首先咱们先应用vue-cli新建我的项目,接着装置依赖:
npm install apollo-cache-inmemory apollo-client apollo-link apollo-link-http apollo-link-ws apollo-utilities vue-apollo -S
引入依赖
// main.jsimport Vue from 'vue'import App from './App.vue'import { apolloProvider } from './vue-apollo';Vue.config.productionTip = falsenew Vue({ render: h => h(App), // 像 vue-router 或 vuex 一样注入apolloProvider apolloProvider,}).$mount('#app')
// vue-apollo.js// 相干文档请查阅 https://apollo.vuejs.org/zh-cn/import { ApolloClient } from 'apollo-client'import { createHttpLink } from 'apollo-link-http'import { InMemoryCache } from 'apollo-cache-inmemory'import Vue from 'vue'import VueApollo from 'vue-apollo'// 新的引入文件import { split } from 'apollo-link'import { WebSocketLink } from 'apollo-link-ws'import { getMainDefinition } from 'apollo-utilities'Vue.use(VueApollo)// 与 API 的 HTTP 连贯const httpLink = createHttpLink({ // 你须要在这里应用绝对路径 uri: 'http://localhost:3001/graphql',})// 创立订阅的 websocket 连贯const wsLink = new WebSocketLink({ uri: 'ws://localhost:3001/graphql', options: { reconnect: true, }})// 应用宰割连贯的性能// 你能够依据发送的操作类型将数据发送到不同的连贯const link = split(({ query }) => { const definition = getMainDefinition(query) return definition.kind === 'OperationDefinition' && definition.operation === 'subscription' }, wsLink, httpLink)// 创立 apollo 客户端const apolloClient = new ApolloClient({ link, cache: new InMemoryCache(), connectToDevTools: true,})export const apolloProvider = new VueApollo({ defaultClient: apolloClient,})
编写业务代码
// App.vue<template> <div id="app"> <img alt="Vue logo" src="./assets/logo.png"> <HelloGraphQL /> </div></template><script>import HelloGraphQL from './components/HelloGraphQL.vue'export default { name: 'app', components: { HelloGraphQL }}</script><style>#app { font-family: 'Avenir',Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px;}</style>
// HelloGraphQL.vue<template> <div class="hello"> 作者姓氏:{{author.firstName}} <button @click="changeAuthor">批改作者姓氏</button> <br> <br> 新增题目:{{post.title}} <button @click="addPost">增加文章</button> <br> 订阅胜利次数:{{receivedSubscriptionTimes}} </div></template><script>import gql from 'graphql-tag'export default { name: 'HelloGraphQL', data: function (){ return { author: {}, post: {}, receivedSubscriptionTimes: 0 } }, apollo: { // Apollo 的具体选项 author: gql`query author { author(id: 2) { id, firstName, posts { id, title } } }`, $subscribe: { postAdded: { query: gql`subscription postAdded{ postAdded { id, title } }`, // 变更之前的后果 result ({ data }) { // 在这里用之前的后果和新数据组合成新的后果 // eslint-disable-next-line console.log(data) this.receivedSubscriptionTimes += 1 } } } }, methods: { // 批改作者 changeAuthor() { // 调用 graphql 变更 this.$apollo.mutate({ // 查问语句 mutation: gql`mutation changeAuthor { changeAuthor(id: 3, firstName: "firstName" lastName: "lastName") { id, firstName, lastName } }`, // 参数 variables: { firstName: '', }, }).then(res => { this.author.firstName = res.data.changeAuthor.firstName; }) }, // 增加文章 addPost() { // 调用 graphql 变更 this.$apollo.mutate({ // 查问语句 mutation: gql`mutation addPost { post: addPost { id, title } }` }).then(res => { this.post = res.data.post; }) } }}</script>
至此,咱们便能够申请server端服务了!????????????