详解在vue-cli中使用graphql即vue-apollo的用法


Posted in Javascript onSeptember 08, 2018

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请求

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
May 24 Javascript
js校验表单后提交表单的三种方法总结
Feb 28 Javascript
js实现图片在未加载完成前显示加载中字样
Sep 03 Javascript
jQuery实现tag便签去重效果的方法
Jan 20 Javascript
你不知道的高性能JAVASCRIPT
Jan 18 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
Mar 28 Javascript
AngularJS指令用法详解
Nov 02 Javascript
jQuery实现页面滚动时智能浮动定位
Jan 08 Javascript
Angular2学习教程之ng中变更检测问题详解
May 28 Javascript
JS设计模式之状态模式概念与用法分析
Feb 05 Javascript
node.js使用redis储存session的方法
Sep 26 Javascript
在js代码拼接dom对象到页面上的模板总结
Oct 21 Javascript
在vue项目中集成graphql(vue-ApolloClient)
Sep 08 #Javascript
React Native开发封装Toast与加载Loading组件示例
Sep 08 #Javascript
原生JS实现前端本地文件上传
Sep 08 #Javascript
JS实现可视化文件上传
Sep 08 #Javascript
js实现文件上传功能 后台使用MultipartFile
Sep 08 #Javascript
vue-router的HTML5 History 模式设置
Sep 08 #Javascript
vue移动端下拉刷新和上拉加载的实现代码
Sep 08 #Javascript
You might like
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
有一段有意思的代码-javascript现实多行信息
2007/08/26 Javascript
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
2014/06/26 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
jquery判断对象是否为空并遍历对象的简单实例
2016/07/26 Javascript
jquery事件绑定解绑机制源码解析
2016/09/19 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
微信小程序开发之录音机 音频播放 动画实例 (真机可用)
2016/12/08 Javascript
浅谈Angular 的变化检测的方法
2018/03/01 Javascript
在layui中select更改后生效的方法
2019/09/05 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
python中列表和元组的区别
2017/12/18 Python
Python与人工神经网络:使用神经网络识别手写图像介绍
2017/12/19 Python
Python实现简易Web爬虫详解
2018/01/03 Python
Python实现识别手写数字大纲
2018/01/29 Python
vue.js实现输入框输入值内容实时响应变化示例
2018/07/07 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
2019/06/03 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
Python逐行读取文件内容的方法总结
2020/02/14 Python
python输入中文的实例方法
2020/09/14 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
2020/09/16 Python
德国PC硬件网站:CASEKING
2016/10/20 全球购物
澳大利亚游乐场设备品牌:Lifespan Kids
2019/05/24 全球购物
切尔西足球俱乐部官方网上商店:Chelsea FC
2019/06/17 全球购物
澳大利亚最便宜的网上药房:Chemist Warehouse
2020/01/30 全球购物
政法大学毕业生自荐信范文
2014/01/01 职场文书
元旦晚会策划方案
2014/02/18 职场文书
报名委托书
2015/01/29 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python