詳解在vue-cli中使用graphql即vue-apollo的用法
1、首先我們需要安裝一下vue-apollo 具體執(zhí)行命令如下:
2、在我們的項(xiàng)目的根目錄下創(chuàng)建一個(gè)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中配置時(shí)解決跨域時(shí)起的代理一個(gè)名字,后面的是后端 暴露接口方法的地址 */ credentials: 'same-origin', /* 這個(gè)屬性的意思是在同源的情況下攜帶cookie,因?yàn)関ue-apollo本身發(fā)送的是一個(gè)fetch請(qǐng)求,所以在發(fā)送請(qǐng)求時(shí)不會(huì)自動(dòng)攜帶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 }, });
準(zhǔn)備好這些,我們就可以開始使用了,另外如果有谷歌賬號(hào),可以在谷歌的應(yīng)用商店去下載“Apollo Client Developer Tools”插件,來模擬vue-apollo調(diào)用接口,當(dāng)然你也可以直接看后端的代碼,然后看接口的定義
4,然后在項(xiàng)目的根目錄下創(chuàng)建一個(gè)graphql文件夾,這個(gè)文件里面去封裝每一個(gè)模塊所對(duì)應(yīng)的方法,為了代碼的簡潔,可以每一個(gè)模塊建立一個(gè)js文件,實(shí)現(xiàn)接口方法的統(tǒng)一管理,比如說我創(chuàng)建了一個(gè)交atemplate.graphql文件,注意這個(gè)文件夾下所有的文件后綴名都是.graphql。
首先我們說一下query方式的調(diào)用:具體代碼如下:
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,然后將該方法引入到所需要調(diào)用的vue文件中引入方式如下:
然后在vue的methods中定義一個(gè)方法,最后調(diào)用
lodAtemplate() { this.$apollo.query({ query: getAssessTemplateListings, variables: { state: 1, page: this.currentPage, pageSize: this.pageSize, }, fetchPolicy: 'network-only', /* 如果一個(gè)獲取數(shù)據(jù)的列表,在參數(shù)沒有變化的時(shí)候,那我們希望用后臺(tái)數(shù)據(jù)的緩存,則需要在請(qǐng)求下方加上 fetchPolicy: 'network-only'來做緩存 */ }).then(({ data }) => { const assessTempalteListings = data.assessTemplateListings; consloe.log(assessTempalteListings); }); }
根據(jù)我們的需求因?yàn)槭谦@取列表的,所以在created方法里面去調(diào)用這個(gè)方法即
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)); }); }
用法我們就說完了,接下來總結(jié)一下
1、因?yàn)榍岸瞬捎胿ue-apollo客戶端發(fā)送fetch方式的graphql的請(qǐng)求,而fetch請(qǐng)求也有的缺點(diǎn):fetch只對(duì)網(wǎng)絡(luò)請(qǐng)求報(bào)錯(cuò),對(duì)400,500都當(dāng)做成功的請(qǐng)求,需要封裝去處理,所以說對(duì)于vue-axios的try,catch是獲取不到錯(cuò)誤的,Apollo請(qǐng)求超時(shí)的問題無法解決,httpLink沒有提供timeout的接口,導(dǎo)致無法中斷或重連當(dāng)前請(qǐng)求
2、通過Apollo查詢返回的數(shù)據(jù)是freeze狀態(tài),無法修改,可以通過對(duì)象淺拷貝或者序列化的方式解凍。這個(gè)坑我自己趟過。
因?yàn)槲乙鲆粋€(gè)對(duì)于某一個(gè)模板增加適用模板區(qū)域的功能,那么要求是先調(diào)用模板詳情接口,如果有區(qū)域就顯示出來,對(duì)已有的區(qū)域可以做增刪改的功能,獲取到數(shù)據(jù)后存在vuex中,當(dāng)我添加完成后更改vuex的數(shù)據(jù)報(bào)錯(cuò),意思是不允許更改,解決辦法就是在初始化vuex的數(shù)據(jù)時(shí)先深拷貝一份數(shù)據(jù)存入到vuex中,而不是直接存入,另外建議可以使用lodash.js,因?yàn)檫@個(gè)js庫集成了很多方法,不用寫那么多繁瑣的代碼
3、再說一下query和mutaionl兩種方式解釋,按照官方的意思是
- query:僅獲取數(shù)據(jù)(fetch)的只讀請(qǐng)求
- mutaion:獲取數(shù)據(jù)后還有寫操作的請(qǐng)求
我個(gè)人認(rèn)為,vue-apollo中的query方式就類似于Ajax中的get請(qǐng)求,而mutaion就類似于post請(qǐng)求
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
elementui中tabel組件的scope.$index的使用及說明
這篇文章主要介紹了elementui中tabel組件的scope.$index的使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue3中vite的@路徑別名與path中resolve實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于vue3中vite的@路徑別名與path中resolve的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02使用Bootstrap + Vue.js實(shí)現(xiàn)添加刪除數(shù)據(jù)示例
本篇文章主要介紹了使用Bootstrap + Vue.js實(shí)現(xiàn) 添加刪除數(shù)據(jù)示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02vue3 element plus中el-radio選中之后再次點(diǎn)擊取消選中問題
這篇文章主要介紹了vue3 element plus中el-radio選中之后再次點(diǎn)擊取消選中問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Vue3+vite實(shí)現(xiàn)使用svg可改變顏色的全過程
Vue3 + Vite 使用 SVG 的方法主要是為了引入和利用圖標(biāo)庫、自定義組件以及通過插件簡化項(xiàng)目構(gòu)建過程,這篇文章給大家介紹了Vue3+vite實(shí)現(xiàn)使用svg可改變顏色的全過程,需要的朋友可以參考下2024-07-07為什么Vue3.0使用Proxy實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽(defineProperty表示不背這個(gè)鍋)
這篇文章主要介紹了為什么Vue3.0使用Proxy實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽?defineProperty表示不背這個(gè)鍋,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10vue實(shí)現(xiàn)省市區(qū)的級(jí)聯(lián)選擇
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)省市區(qū)的級(jí)聯(lián)選擇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10使用Webpack提升Vue.js應(yīng)用程序的4種方法(翻譯)
這篇文章主要介紹了使用Webpack提升Vue.js應(yīng)用程序的4種方法(翻譯),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10