這個插件是用於http請求的,類似於jquery的ajax函數,支持多種http方法和jsonp。
下面是resource支持的http方法。
get: {method: 'GET'},
save: {method: 'POST'},
query: {method: 'GET'}, update: {method: 'PUT'},
remove: {method: 'DELETE'},
delete: {method: 'DELETE'}
使用方法
標簽引入:
<script src="https://cdn.jsdelivr.net/vue.resource/1.0.3/vue-resource.min.js"></script>
模塊引入:
es6:
import Vue from 'vue';
import VueResource from 'vue-resource'
Vue.use(VueResource);
commonjs
var Vue = require('vue'); var VueResource = require('vue-resource'); Vue.use(VueResource);
實例化一個resource對象
var resource = this.$resource('someItem{/id}');
一個例子:
{ // GET方法請求的url,可以換成jsonp, this.$http.get('/someUrl').then(//在vue實例中使用,也可以全局使用Vue.resource (response) => { // 如果請求成功,調用的回調函數,傳入響應的json數據作為參數 }, (response) => { // 出現錯誤時調用的回調函數 }); }
比如要從百度api請求一個天氣信息:
getWeather() { //從百度api獲取天氣信息
this.$http.jsonp(this.url)//用jsonp方法
.then((response) => { //異步
if (response) {
console.log(response);
this.weatherInfo = response.data.results[0]; } },(response)=>{console.log('error')});
一個bug
在完成todolist(練手的小應用,詳情請戳<--)的天氣組件時原先的模板中,只有天氣組件的模板沒有v-if指令(與下面的代碼對比一下),這時運行時會出錯,原因見下面。
<template>
<ul class='weather'>
<li><h3 style='display:inline; color: #f66'>{{weatherInfo.currentCity}}</h3> | pm2.5-{{weatherInfo.pm25}}</li>
<li>
<ul>
<li v-for="item in weatherInfo.weather_data" class='detail' @click='addClass'>
<p title="詳情" class='date'>{{item.date.slice(0,10)}}</p>
<p>
<img :src="item.dayPictureUrl">
<img :src="item.nightPictureUrl">
</p>
<p>{{item.weather}}</p>
<p>{{item.wind}}</p>
<p>{{item.temperature}}</p>
</li>
</ul>
</li>
</ul>
</template>
原因就是服務器返回的數據晚vue渲染組件,雖然在created的鈎子函數調用了this.getweather()方法,但是在渲染組件時瀏覽器還沒有接收到返回數據,這時就會由於weatherInfo為null導致渲染失敗而報錯。解決辦法是加入v-if="weatherInfo",如果獲取了weatherInfo,則顯示組件,否則顯示加載的動畫。代碼如下:
<template>
<!--顯示天氣界面-->
<ul class='weather' v-if="weatherInfo">//這里加入了v-if
<li><h3 style='display:inline; color: #f66'>{{weatherInfo.currentCity}}</h3> | pm2.5-{{weatherInfo.pm25}}</li>
<li>
<ul>
<li v-for="item in weatherInfo.weather_data" class='detail' @click='addClass'>
<p title="詳情" class='date'>{{item.date.slice(0,10)}}</p>
<p>
<img :src="item.dayPictureUrl">
<img :src="item.nightPictureUrl">
</p>
<p>{{item.weather}}</p>
<p>{{item.wind}}</p>
<p>{{item.temperature}}</p>
</li>
</ul>
</li>
</ul>
<!--加載動畫-->
<p id="preloader_1" v-else>//沒有天氣數據就顯示加載動畫
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</p>
</template>
<script>
export default {
data() {
return {
url: 'http://api.map.baidu.com/telematics/v3/weather?location=上海&output=json&ak=HGOUnCXeQLEeywhGOu2jU29PFdC6duFF',
weatherInfo: null,
timer: null
}
},
created() { //鈎子函數,組件創建完成時調用getWeather方法獲取天氣信息
this.getWeather();
},
methods: {
getWeather() { //從百度api獲取天氣信息
this.$http.jsonp(this.url)
.then((response) => { //異步
if (response) {
console.log(response);
this.weatherInfo = response.data.results[0];
} else { //沒有響應就再發起一次
console.error('agian');
this.getWeather();
}
});
},
addClass(e) { //通過這個方法完成天氣信息的顯示和隱藏。
if (e.currentTarget.nodeName == 'LI') {
var li = e.currentTarget;
if (!/show/.test(li.className)) {
li.className += ' show';
} else {
li.className = li.className.replace(' show', '');
}
}
}
}
}
</script>
one more thing,除了寫請求成功的回調函數外,還應該寫上請求失敗的回調函數。這樣程序才健壯。
