1、首先我们需要安装一下vue-apollo 具体执行命令如下:
复制代码 代码如下:npm install –save vue-apollo graphql apollo-client apollo-link apollo-link-http apollo-cache-inmemory graphql-tag
2、在我们的项目的根目录下创建一个vueApollo.js文件具体配置如下:
import { ApolloClient } from 'apollo-client'; import { HttpLink } from 'apollo-link-http'; import { InMemoryCache } from 'apollo-cache-inmemory'; import VueApollo from 'vue-apollo'; const httpLink = new HttpLink({ uri: './v1/assess/api', /* 其中./v1是我在vue的config中配置时解决跨域时起的代理一个名字,后面的是后端 暴露接口方法的地址 */ credentials: 'same-origin', /* 这个属性的意思是在同源的情况下携带cookie,因为vue-apollo本身发送的是一个fetch请求,所以在发送请求时不会自动携带cookie,所以我们需要加上此属性 */ }); const apolloClient = new ApolloClient({ link: httpLink, cache: new InMemoryCache(), connectToDevTools: true, }); export default new VueApollo({ defaultClient: apolloClient, clients: { default: apolloClient }, });
3,接着我们将配置好的js文件引入到man.js中,具体如下:
import Vue from 'vue'; import ElementUI from 'element-ui'; import VueApollo from 'vue-apollo'; import apolloProvider from './apollo'; // Install the vue plugin // Vue.component('full-calendar', fullCalendar); Vue.config.productionTip = false; Vue.use(ElementUI); Vue.use(VueApollo); /* eslint-disable no-new */ new Vue({ el: '#app', provide: apolloProvider.provide(), //这句代码是我们要和vuex一样,将apolloProvider添加为根组件 router, store, template: '<App/>', components: { App }, });
准备好这些,我们就可以开始使用了,另外如果有谷歌账号,可以在谷歌的应用商店去下载“Apollo Client Developer Tools”插件,来模拟vue-apollo调用接口,当然你也可以直接看后端的代码,然后看接口的定义
4,然后在项目的根目录下创建一个graphql文件夹,这个文件里面去封装每一个模块所对应的方法,为了代码的简洁,可以每一个模块建立一个js文件,实现接口方法的统一管理,比如说我创建了一个交atemplate.graphql文件,注意这个文件夹下所有的文件后缀名都是.graphql。
首先我们说一下query方式的调用:具体代码如下:
query getAssessTemplateListings($query: String, $state: Int, $page: Int, $pageSize: Int) { assessTemplateListings(query: $query, state: $state, page: $page, pageSize: $pageSize) { assessTemplates { id groupId name description state createdAt updatedAt } page pageSize total } }
5,然后将该方法引入到所需要调用的vue文件中引入方式如下:
复制代码 代码如下:import { getAssessTemplateListings, stopAssessTemplate } from '@/services/graphql/assessTemplate.graphql';
然后在vue的methods中定义一个方法,最后调用
lodAtemplate() { this.$apollo.query({ query: getAssessTemplateListings, variables: { state: 1, page: this.currentPage, pageSize: this.pageSize, }, fetchPolicy: 'network-only', /* 如果一个获取数据的列表,在参数没有变化的时候,那我们希望用后台数据的缓存,则需要在请求下方加上 fetchPolicy: 'network-only'来做缓存 */ }).then(({ data }) => { const assessTempalteListings = data.assessTemplateListings; consloe.log(assessTempalteListings); }); }
根据我们的需求因为是获取列表的,所以在created方法里面去调用这个方法即
created () { this.lodAtemplate(); }
然后再看一下mutation的用法,封装如下:
mutation stopAssessTemplate($input: StopAssessTemplateInput!) { stopAssessTemplate(input: $input) { clientMutationId } }
在vue中的使用
stop () { this.$apollo.mutate({ mutation: stopAssessTemplate, variables: { input: { clientMutationId: uuidv1(), id: obj.id, }, }, }).then(() => { }).catch((error) => { this.$message.error(Util.Comm.graphqlError(error.message)); }); }
用法我们就说完了,接下来总结一下
1、因为前端采用vue-apollo客户端发送fetch方式的graphql的请求,而fetch请求也有的缺点:fetch只对网络请求报错,对400,500都当做成功的请求,需要封装去处理,所以说对于vue-axios的try,catch是获取不到错误的,Apollo请求超时的问题无法解决,httpLink没有提供timeout的接口,导致无法中断或重连当前请求
2、通过Apollo查询返回的数据是freeze状态,无法修改,可以通过对象浅拷贝或者序列化的方式解冻。这个坑我自己趟过。
因为我要做一个对于某一个模板增加适用模板区域的功能,那么要求是先调用模板详情接口,如果有区域就显示出来,对已有的区域可以做增删改的功能,获取到数据后存在vuex中,当我添加完成后更改vuex的数据报错,意思是不允许更改,解决办法就是在初始化vuex的数据时先深拷贝一份数据存入到vuex中,而不是直接存入,另外建议可以使用lodash.js,因为这个js库集成了很多方法,不用写那么多繁琐的代码
3、再说一下query和mutaionl两种方式解释,按照官方的意思是
- query:仅获取数据(fetch)的只读请求
- mutaion:获取数据后还有写操作的请求
我个人认为,vue-apollo中的query方式就类似于Ajax中的get请求,而mutaion就类似于post请求
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]