最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

談?wù)刅ue.js——vue-resource全攻略

 更新時間:2017年01月16日 11:54:40   作者:keepfool  
本篇文章主要介紹了談?wù)刅ue.js——vue-resource全攻略,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

概述

上一篇我們介紹了如何將$.ajax和Vue.js結(jié)合在一起使用,并實現(xiàn)了一個簡單的跨域CURD示例。Vue.js是數(shù)據(jù)驅(qū)動的,這使得我們并不需要直接操作DOM,如果我們不需要使用jQuery的DOM選擇器,就沒有必要引入jQuery。vue-resource是Vue.js的一款插件,它可以通過XMLHttpRequest或JSONP發(fā)起請求并處理響應(yīng)。也就是說,$.ajax能做的事情,vue-resource插件一樣也能做到,而且vue-resource的API更為簡潔。另外,vue-resource還提供了非常有用的inteceptor功能,使用inteceptor可以在請求前和請求后附加一些行為,比如使用inteceptor在ajax請求時顯示loading界面。

本文的主要內(nèi)容如下:

  • 介紹vue-resource的特點
  • 介紹vue-resource的基本使用方法
  • 基于this.$http的增刪查改示例
  • 基于this.$resource的增刪查改示例
  • 基于inteceptor實現(xiàn)請求等待時的loading畫面
  • 基于inteceptor實現(xiàn)請求錯誤時的提示畫面

本文11個示例的源碼:http://xiazai.jb51.net/201701/yuanma/vue-resource_jb51.rar

vue-resource特點

vue-resource插件具有以下特點:

1. 體積小

vue-resource非常小巧,在壓縮以后只有大約12KB,服務(wù)端啟用gzip壓縮后只有4.5KB大小,這遠比jQuery的體積要小得多。

2. 支持主流的瀏覽器

和Vue.js一樣,vue-resource除了不支持IE 9以下的瀏覽器,其他主流的瀏覽器都支持。

3. 支持Promise API和URI Templates

Promise是ES6的特性,Promise的中文含義為“先知”,Promise對象用于異步計算。

URI Templates表示URI模板,有些類似于ASP.NET MVC的路由模板。

4. 支持攔截器

攔截器是全局的,攔截器可以在請求發(fā)送前和發(fā)送請求后做一些處理。

攔截器在一些場景下會非常有用,比如請求發(fā)送前在headers中設(shè)置access_token,或者在請求失敗時,提供共通的處理方式。

vue-resource使用

引入vue-resource

<script src="js/vue.js"></script>
<script src="js/vue-resource.js"></script>

基本語法

引入vue-resource后,可以基于全局的Vue對象使用http,也可以基于某個Vue實例使用http。

// 基于全局Vue對象使用http
Vue.http.get('/someUrl', [options]).then(successCallback, errorCallback);
Vue.http.post('/someUrl', [body], [options]).then(successCallback, errorCallback);

// 在一個Vue實例內(nèi)使用$http
this.$http.get('/someUrl', [options]).then(successCallback, errorCallback);
this.$http.post('/someUrl', [body], [options]).then(successCallback, errorCallback);

在發(fā)送請求后,使用then方法來處理響應(yīng)結(jié)果,then方法有兩個參數(shù),第一個參數(shù)是響應(yīng)成功時的回調(diào)函數(shù),第二個參數(shù)是響應(yīng)失敗時的回調(diào)函數(shù)。

then方法的回調(diào)函數(shù)也有兩種寫法,第一種是傳統(tǒng)的函數(shù)寫法,第二種是更為簡潔的ES 6的Lambda寫法:

// 傳統(tǒng)寫法
this.$http.get('/someUrl', [options]).then(function(response){
  // 響應(yīng)成功回調(diào)
}, function(response){
  // 響應(yīng)錯誤回調(diào)
});


// Lambda寫法
this.$http.get('/someUrl', [options]).then((response) => {
  // 響應(yīng)成功回調(diào)
}, (response) => {
  // 響應(yīng)錯誤回調(diào)
});

PS:做過.NET開發(fā)的人想必對Lambda寫法有一種熟悉的感覺。

支持的HTTP方法

vue-resource的請求API是按照REST風(fēng)格設(shè)計的,它提供了7種請求API:

  • get(url, [options])
  • head(url, [options])
  • delete(url, [options])
  • jsonp(url, [options])
  • post(url, [body], [options])
  • put(url, [body], [options])
  • patch(url, [body], [options])

除了jsonp以外,另外6種的API名稱是標(biāo)準的HTTP方法。當(dāng)服務(wù)端使用REST API時,客戶端的編碼風(fēng)格和服務(wù)端的編碼風(fēng)格近乎一致,這可以減少前端和后端開發(fā)人員的溝通成本。

客戶端請求方法 服務(wù)端處理方法
this.$http.get(...) Getxxx
this.$http.post(...) Postxxx
this.$http.put(...) Putxxx
this.$http.delete(...) Deletexxx

options對象

發(fā)送請求時的options選項對象包含以下屬性:

參數(shù) 類型 描述
url string 請求的URL
method string 請求的HTTP方法,例如:'GET', 'POST'或其他HTTP方法
body Object, FormData string request body
params Object 請求的URL參數(shù)對象
headers Object request header
timeout number 單位為毫秒的請求超時時間 (0 表示無超時時間)
before function(request) 請求發(fā)送前的處理函數(shù),類似于jQuery的beforeSend函數(shù)
progress function(event) ProgressEvent回調(diào)處理函數(shù)
credentials boolean 表示跨域請求時是否需要使用憑證
emulateHTTP boolean 發(fā)送PUT, PATCH, DELETE請求時以HTTP POST的方式發(fā)送,并設(shè)置請求頭的X-HTTP-Method-Override
emulateJSON boolean 將request body以application/x-www-form-urlencoded content type發(fā)送

emulateHTTP的作用

如果Web服務(wù)器無法處理PUT, PATCH和DELETE這種REST風(fēng)格的請求,你可以啟用enulateHTTP現(xiàn)象。啟用該選項后,請求會以普通的POST方法發(fā)出,并且HTTP頭信息的X-HTTP-Method-Override屬性會設(shè)置為實際的HTTP方法。

Vue.http.options.emulateHTTP = true;

emulateJSON的作用

如果Web服務(wù)器無法處理編碼為application/json的請求,你可以啟用emulateJSON選項。啟用該選項后,請求會以application/x-www-form-urlencoded作為MIME type,就像普通的HTML表單一樣。

Vue.http.options.emulateJSON = true;

response對象

response對象包含以下屬性:

方法 類型 描述
text() string 以string形式返回response body
json() Object 以JSON對象形式返回response body
blob() Blob 以二進制形式返回response body
屬性 類型 描述
ok boolean 響應(yīng)的HTTP狀態(tài)碼在200~299之間時,該屬性為true
status number 響應(yīng)的HTTP狀態(tài)碼
statusText string 響應(yīng)的狀態(tài)文本
headers Object 響應(yīng)頭

注意:本文的vue-resource版本為v0.9.3,如果你使用的是v0.9.0以前的版本,response對象是沒有json(), blob(), text()這些方法的。

CURD示例

提示:以下示例仍然沿用上一篇的組件和WebAPI,組件的代碼和頁面HTML代碼我就不再貼出來了。

GET請求

var demo = new Vue({
  el: '#app',
  data: {
    gridColumns: ['customerId', 'companyName', 'contactName', 'phone'],
    gridData: [],
    apiUrl: 'http://211.149.193.19:8080/api/customers'
  },
  ready: function() {
    this.getCustomers()
  },
  methods: {
    getCustomers: function() {
      this.$http.get(this.apiUrl)
        .then((response) => {
          this.$set('gridData', response.data)
        })
        .catch(function(response) {
          console.log(response)
        })
    }
  }
})

這段程序的then方法只提供了successCallback,而省略了errorCallback。

catch方法用于捕捉程序的異常,catch方法和errorCallback是不同的,errorCallback只在響應(yīng)失敗時調(diào)用,而catch則是在整個請求到響應(yīng)過程中,只要程序出錯了就會被調(diào)用。

在then方法的回調(diào)函數(shù)內(nèi),你也可以直接使用this,this仍然是指向Vue實例的:

getCustomers: function() {
  this.$http.get(this.apiUrl)
    .then((response) => {
      this.$set('gridData', response.data)
    })
    .catch(function(response) {
      console.log(response)
    })
}

為了減少作用域鏈的搜索,建議使用一個局部變量來接收this。

 JSONP請求

getCustomers: function() {
  this.$http.jsonp(this.apiUrl).then(function(response){
    this.$set('gridData', response.data)
  })
}

POST請求

var demo = new Vue({
  el: '#app',
  data: {
    show: false,
    gridColumns: [{
      name: 'customerId',
      isKey: true
    }, {
      name: 'companyName'
    }, {
      name: 'contactName'
    }, {
      name: 'phone'
    }],
    gridData: [],
    apiUrl: 'http://211.149.193.19:8080/api/customers',
    item: {}
  },
  ready: function() {
    this.getCustomers()
  },
  methods: {
    closeDialog: function() {
      this.show = false
    },
    getCustomers: function() {
      var vm = this
      vm.$http.get(vm.apiUrl)
        .then((response) => {
          vm.$set('gridData', response.data)
        })
    },
    createCustomer: function() {
      var vm = this
      vm.$http.post(vm.apiUrl, vm.item)
        .then((response) => {
          vm.$set('item', {})
          vm.getCustomers()
        })
      this.show = false
    }
  }
})

 PUT請求

updateCustomer: function() {
  var vm = this
  vm.$http.put(this.apiUrl + '/' + vm.item.customerId, vm.item)
    .then((response) => {
      vm.getCustomers()
    })
}

 

Delete請求

deleteCustomer: function(customer){
  var vm = this
  vm.$http.delete(this.apiUrl + '/' + customer.customerId)
    .then((response) => {
      vm.getCustomers()
    })
}


使用resource服務(wù)

vue-resource提供了另外一種方式訪問HTTP——resource服務(wù),resource服務(wù)包含以下幾種默認的action:

get: {method: 'GET'},
save: {method: 'POST'},
query: {method: 'GET'},
update: {method: 'PUT'},
remove: {method: 'DELETE'},
delete: {method: 'DELETE'}

resource對象也有兩種訪問方式:

  • 全局訪問:Vue.resource
  • 實例訪問:this.$resource

resource可以結(jié)合URI Template一起使用,以下示例的apiUrl都設(shè)置為{/id}了:

apiUrl: 'http://211.149.193.19:8080/api/customers{/id}'

GET請求

使用get方法發(fā)送GET請求,下面這個請求沒有指定{/id}。

getCustomers: function() {

  var resource = this.$resource(this.apiUrl)
    vm = this

  resource.get()
    .then((response) => {
      vm.$set('gridData', response.data)
    })
    .catch(function(response) {
      console.log(response)
    })
}

POST請求

使用save方法發(fā)送POST請求,下面這個請求沒有指定{/id}。

createCustomer: function() {
  var resource = this.$resource(this.apiUrl)
    vm = this
    
  resource.save(vm.apiUrl, vm.item)
    .then((response) => {
      vm.$set('item', {})
      vm.getCustomers()
    })
  this.show = false
}

 PUT請求

使用update方法發(fā)送PUT請求,下面這個請求指定了{/id}。

updateCustomer: function() {
  var resource = this.$resource(this.apiUrl)
    vm = this
    
  resource.update({ id: vm.item.customerId}, vm.item)
    .then((response) => {
      vm.getCustomers()
    })
}

{/id}相當(dāng)于一個占位符,當(dāng)傳入實際的參數(shù)時該占位符會被替換。

例如,{ id: vm.item.customerId}中的vm.item.customerId為12,那么發(fā)送的請求URL為:

http://211.149.193.19:8080/api/customers/12

 DELETE請求

使用remove或delete方法發(fā)送DELETE請求,下面這個請求指定了{/id}。

deleteCustomer: function(customer){
  var resource = this.$resource(this.apiUrl)
    vm = this
    
  resource.remove({ id: customer.customerId})
    .then((response) => {
      vm.getCustomers()
    })
}

 使用inteceptor

攔截器可以在請求發(fā)送前和發(fā)送請求后做一些處理。

基本用法

Vue.http.interceptors.push((request, next) => {
    // ...
    // 請求發(fā)送前的處理邏輯
    // ...
  next((response) => {
    // ...
    // 請求發(fā)送后的處理邏輯
    // ...
    // 根據(jù)請求的狀態(tài),response參數(shù)會返回給successCallback或errorCallback
    return response
  })
})

在response返回給successCallback或errorCallback之前,你可以修改response中的內(nèi)容,或做一些處理。

例如,響應(yīng)的狀態(tài)碼如果是404,你可以顯示友好的404界面。

如果不想使用Lambda函數(shù)寫法,可以用平民寫法:

Vue.http.interceptors.push(function(request, next) {
  // ...
  // 請求發(fā)送前的處理邏輯
  // ...
  next(function(response) {
    // ...
    // 請求發(fā)送后的處理邏輯
    // ...
    // 根據(jù)請求的狀態(tài),response參數(shù)會返回給successCallback或errorCallback
    return response
  })
})

示例1

之前的CURD示例有一處用戶體驗不太好,用戶在使用一些功能的時候如果網(wǎng)絡(luò)較慢,畫面又沒有給出反饋,用戶是不知道他的操作是成功還是失敗的,他也不知道是否該繼續(xù)等待。

通過inteceptor,我們可以為所有的請求處理加一個loading:請求發(fā)送前顯示loading,接收響應(yīng)后隱藏loading。

具體步驟如下:

1.添加一個loading組件

<template id="loading-template">
  <div class="loading-overlay">
    <div class="sk-three-bounce">
      <div class="sk-child sk-bounce1"></div>
      <div class="sk-child sk-bounce2"></div>
      <div class="sk-child sk-bounce3"></div>
    </div>
  </div>
</template>



2.將loading組件作為另外一個Vue實例的子組件

var help = new Vue({
  el: '#help',
  data: {
    showLoading: false
  },
  components: {
    'loading': {
      template: '#loading-template',
    }
  }
})

3.將該Vue實例掛載到某個HTML元素

<div id="help">
  <loading v-show="showLoading"></loading>
</div>

4.添加inteceptor

Vue.http.interceptors.push((request, next) => {
  loading.show = true
  next((response) => {
    loading.show = false
    return response
  });
});


示例2

當(dāng)用戶在畫面上停留時間太久時,畫面數(shù)據(jù)可能已經(jīng)不是最新的了,這時如果用戶刪除或修改某一條數(shù)據(jù),如果這條數(shù)據(jù)已經(jīng)被其他用戶刪除了,服務(wù)器會反饋一個404的錯誤,但由于我們的put和delete請求沒有處理errorCallback,所以用戶是不知道他的操作是成功還是失敗了。

你問我為什么不在每個請求里面處理errorCallback,這是因為我比較懶。這個問題,同樣也可以通過inteceptor解決。

1. 繼續(xù)沿用上面的loading組件,在#help元素下加一個對話框

<div id="help">
  <loading v-show="showLoading" ></loading>
  <modal-dialog :show="showDialog">
    <header class="dialog-header" slot="header">
      <h1 class="dialog-title">Server Error</h1>
    </header>
    <div class="dialog-body" slot="body">
      <p class="error">Oops,server has got some errors, error code: {{errorCode}}.</p>
    </div>
  </modal-dialog>
</div>

2.給help實例的data選項添加兩個屬性

var help = new Vue({
    el: '#help',
    data: {
      showLoading: false,
      showDialog: false,
      errorCode: ''
    },
    components: {
      'loading': {
        template: '#loading-template',
      }
    }
  })

3.修改inteceptor

Vue.http.interceptors.push((request, next) => {
  help.showLoading = true
  next((response) => {
    if(!response.ok){
      help.errorCode = response.status
      help.showDialog = true
    }
    help.showLoading = false
    return response
  });
});

總結(jié)

vue-resource是一個非常輕量的用于處理HTTP請求的插件,它提供了兩種方式來處理HTTP請求:

  • 使用Vue.http或this.$http
  • 使用Vue.resource或this.$resource

這兩種方式本質(zhì)上沒有什么區(qū)別,閱讀vue-resource的源碼,你可以發(fā)現(xiàn)第2種方式是基于第1種方式實現(xiàn)的。

inteceptor可以在請求前和請求后附加一些行為,這意味著除了請求處理的過程,請求的其他環(huán)節(jié)都可以由我們來控制。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue cli3 調(diào)用百度翻譯API翻譯頁面的實現(xiàn)示例

    vue cli3 調(diào)用百度翻譯API翻譯頁面的實現(xiàn)示例

    這篇文章主要介紹了vue cli3 調(diào)用百度翻譯API翻譯頁面的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • vue實現(xiàn)經(jīng)典選項卡功能

    vue實現(xiàn)經(jīng)典選項卡功能

    這篇文章主要為大家詳細介紹了vue實現(xiàn)經(jīng)典選項卡功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vue組件懶加載的操作代碼

    Vue組件懶加載的操作代碼

    在本文中,我們學(xué)習(xí)了如何使用 Intersection Observer API 和?defineAsyncComponent?函數(shù)在 Vue 組件可見時對其進行懶加載,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友一起看看吧
    2023-09-09
  • 關(guān)于vue項目一直出現(xiàn) sockjs-node/info?t=XX的解決辦法

    關(guān)于vue項目一直出現(xiàn) sockjs-node/info?t=XX的解決辦法

    sockjs-node 是一個JavaScript庫,提供跨瀏覽器JavaScript的API,創(chuàng)建了一個低延遲、全雙工的瀏覽器和web服務(wù)器之間通信通道,這篇文章主要介紹了vue項目一直出現(xiàn) sockjs-node/info?t=XX的解決辦法,需要的朋友可以參考下
    2023-12-12
  • vue activated在子組件中的使用詳情

    vue activated在子組件中的使用詳情

    這篇文章主要介紹了vue activated在子組件中的使用,文章圍繞vue activated的xingu你資料講解展開內(nèi)容并附上具體代碼,需要的朋友可以參考一下
    2021-11-11
  • Vue監(jiān)聽頁面變化的實現(xiàn)方法小結(jié)

    Vue監(jiān)聽頁面變化的實現(xiàn)方法小結(jié)

    在Vue.js應(yīng)用開發(fā)過程中,監(jiān)聽頁面變化是一個非常常見的需求,無論是為了響應(yīng)用戶交互、優(yōu)化性能,還是實現(xiàn)復(fù)雜的業(yè)務(wù)邏輯,監(jiān)聽頁面變化的能力都是不可或缺的,本文將詳細介紹如何在Vue項目中實現(xiàn)頁面變化監(jiān)聽,需要的朋友可以參考下
    2024-10-10
  • 前端通過vue調(diào)用后端接口導(dǎo)出excel表格基本步驟

    前端通過vue調(diào)用后端接口導(dǎo)出excel表格基本步驟

    在Vue前端項目中,可通過axios庫發(fā)送請求至后端獲取Excel下載鏈接,文中通過代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-10-10
  • Vue點擊切換顏色的方法

    Vue點擊切換顏色的方法

    今天小編就為大家分享一篇Vue點擊切換顏色的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • vue+rem自定義輪播圖效果

    vue+rem自定義輪播圖效果

    這篇文章主要為大家詳細介紹了vue+rem自定義輪播圖效果,手指觸摸左滑和右滑,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • vue鼠標(biāo)懸停事件監(jiān)聽實現(xiàn)方法

    vue鼠標(biāo)懸停事件監(jiān)聽實現(xiàn)方法

    頁面在鼠標(biāo)懸停(不動)n秒之后,頁面進行相應(yīng)的事件,下面這篇文章主要給大家介紹了關(guān)于vue鼠標(biāo)懸停事件監(jiān)聽的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09

最新評論

海伦市| 藁城市| 诸暨市| 抚宁县| 永清县| 茂名市| 腾冲县| 阳山县| 马山县| 栖霞市| 静宁县| 兴山县| 勐海县| 舒城县| 碌曲县| 吉林省| 泊头市| 永福县| 化德县| 尉氏县| 浪卡子县| 阳江市| 成武县| 泽库县| 涡阳县| 江永县| 龙陵县| 巧家县| 大洼县| 保山市| 荔波县| 萨迦县| 建水县| 曲麻莱县| 江西省| 乌拉特后旗| 广元市| 临武县| 慈利县| 伽师县| 南投县|