1. 程式人生 > >在vue-cli中使用graphql即vue-apollo的用法

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

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

相關推薦

Vue-cli構建的Vue項目Expected linebreaks to be 'CRLF' but found 'LF'

des js文件 spa rule 目錄 原因 expect 項目 cli 解決方案: 修改項目根目錄下有.eslintrc.js文件,在配置文件中修改rule配置項: ‘linebreak-style‘: ‘off‘現象:js文件全體報紅,不影響項目啟動,出現原因是esl

vue-cli使用rem,vue自適應

1.rem.js內容            ! function(n) {            var e = n.document,t = e.documentElement,i = 720,d =

vue-cli使用graphqlvue-apollo用法

1、首先我們需要安裝一下vue-apollo 具體執行命令如下: npm install –save vue-apollo graphql apollo-client apollo-link apollo-link-http apollo-cache-inme

vue-cli 遇見的問題,記錄爬坑日常!

ges code spa jpg mage 插件 圖片 alt res 本片文章我將會記錄使用vue-cli 以及一些相關插件遇見的問題和解決方案,另外本文章將會持續更新,本著互聯網分享精神,希望我所記錄的日常能對大家有所幫助。 1、在img和html文件處於同級階段,im

vue-cli引入jquery方法

import gin targe vid brush ebp blog base tar 這裏有個詳解,當然,僅僅是安裝jq的話下面這個辦法就夠了。傳送門 在webpack.base.conf.js裏加入 var webpack = require("webpack")

vue-cli使用stylus

使用 all dev ber nbsp 寫入 安裝插件 itl original 1、在package.json文件中寫入依賴: "stylus-loader": "^2.5.0", "stylus": "0.52.4", 2、在命令行運行npm inst

vue-cli的babel配置文件.babelrc詳解

tran comm res 並且 出現 特定 string vue-cli develop 本文介紹vue-cli腳手架工具根目錄的babelrc配置文件 介紹 es6特性瀏覽器還沒有全部支持,但是使用es6是大勢所趨,所以babel應運而生,用來將es6代碼轉換成瀏覽

vue-cli引入jquery的方法

util jquery var 進入 sta 技術分享 logs 導入 json vue-cli中引入jquery的方法 以前寫vue項目都沒有引入過jquery,今天群裏面的一位小夥伴問了我這個問題,我就自己搗鼓了一下,方法如下: 我們先進入webpack.base.co

vue-cli安裝方法

auth blog deb package 現在 ref lac 自定義 node 源:http://www.cnblogs.com/jn1223/p/6656956.html vue-cli中安裝方法 vue-cli腳手架模板是基於node

vue-cli的build.js配置文件詳細解析

刪除 .json directory 內置 tostring file 環境配置 輸出 pin 轉載自:https://www.cnblogs.com/ye-hcj/p/7096341.html這是vue-cli腳手架工具的生產環境配置入口 package.json中的"b

vue-cli安裝scss,且可以全局引入scss的步驟

dirname source generate install cnpm clas pre www ner 在寫vue的css樣式時,覺得需要css預處理器讓自己的css更加簡潔、適應性更強、可讀性更佳,更易於代碼的維護,於是在vue-cli腳手架采用scss。寫過的人都知

vue-cli的ESlint配置文件eslintrc.js詳解

nds str -a vsc == 環境 出錯 allow tom 本文講解vue-cli腳手架根目錄文件.eslintrc.js eslint簡介 eslint是用來管理和檢測js代碼風格的工具,可以和編輯器搭配使用,如vscode的eslint插件 當有不

vue-cli使用mock.js詳解

r.js The sage eve conf url RoCE code color 引包1. npm install mockjs --save-dev2. npm install axios --save(axios使用不再講) 修改配置3. 在config文件夾

vue-cli 的 webpack 配置詳解

class api 靜態文件 分析 錯誤提示 後端 nodejs start 三方庫 本篇文章主要介紹了 vue-cli 2.8.2 中的 webpack 配置詳解, 做個學習筆記 版本 vue-cli 2.8.1 (終端通過 vue -V 可查看) vue 2.2.2

vue-cli添加使用less

tle 復制 是我 進行 rip dev name js使用 環境 在vue-cli中構建的項目是可以使用less的,但是查看package.json可以發現,並沒有less相關的插件,所以我們需要自行安裝。 第一步:安裝 npm install less less

vue-cli使用vuex 刷新後數據消失問題

com vue cal 瀏覽器 效果 名稱 rip sea 產品 vue-cli中使用vuex 刷新後數據消失問題 這個時候要用localStorage 參考 //使用情況 其他代碼省略 //Header.vue中 <template> <div i

webpack+vue-cli代理配置(proxyTable)

info ubd 技術 ets conf local src nod mage 在做vue的項目時,用到webpack打包工具,我們會發現本地開發開啟的node服務地址請求接口的地址存在跨域問題。本地開啟的服務地址是 http://localhost:8080 而服務器

Vue-cli使用vConsole,以及設定JS連續點選控制vConsole按鈕顯隱功能實現

一、vue-cli腳手架中搭建的專案引入vConsole除錯 1.首先npm安裝,大家都懂的。 npm install vconsole 2.在合適的地方新建一個檔案vconsole.js,內容如下: import Vconsole from 'vconsole' let vConso

Vue-cli使用vConsole,以及設置JS連續點擊控制vConsole按鈕顯隱功能實現

vco from main date export lse 發包 操作 前端開發 一、vue-cli腳手架中搭建的項目引入vConsole調試 1.首先npm安裝,大家都懂的。 npm install vconsole 2.在合適的地方新建一個文件vconsole.js

vue.js :is 與 is 的用法和區別,學習全域性與區域性註冊元件

  vue中 is用來動態切換元件,詳細請看示例:(順便講解父向子元件的傳遞資訊) html: <div id="app">   <!--         1.在這裡呼叫元件。   &