vue-resource初体验

Posted 饭特稠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue-resource初体验相关的知识,希望对你有一定的参考价值。

这个插件是用于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,除了写请求成功的回调函数外,还应该写上请求失败的回调函数。这样程序才健壮。

以上是关于vue-resource初体验的主要内容,如果未能解决你的问题,请参考以下文章

python初体验

Flutter学习-flutter开发初体验

Django 代码初体验

结对编程初体验——代码复审

Qt for Python 5.12初体验

Kotlin初体验