在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中使用graphql即vue-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.在這裡呼叫元件。 &