zoukankan      html  css  js  c++  java
  • 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,除了写请求成功的回调函数外,还应该写上请求失败的回调函数。这样程序才健壮。

  • 相关阅读:
    快速幂模板
    部分有关素数的题
    POJ 3624 Charm Bracelet (01背包)
    51Nod 1085 背包问题 (01背包)
    POJ 1789 Truck History (Kruskal 最小生成树)
    HDU 1996 汉诺塔VI
    HDU 2511 汉诺塔X
    HDU 2175 汉诺塔IX (递推)
    HDU 2077 汉诺塔IV (递推)
    HDU 2064 汉诺塔III (递推)
  • 原文地址:https://www.cnblogs.com/imgss/p/6253411.html
Copyright © 2011-2022 走看看