vue:天气查询


这次把axios和vue结合起来写个查询天气的东西。

我们希望在搜索框输入城市名字,就能显示对应的天气。并且搜索框下面有四个城市,也就是所谓的"hotkey".点击这四座城市中的任意一座,都能显示其近五天的天气情况。

首先我们要有一个搜索框,然后,我们希望的是在框里输入城市名字后,按回车,其天气信息就会显示出来。怎么实现呢?@keyup.enter就可以了。除此之外,还要给这个东西绑定一个函数,这个函数需要向对应的请求地址请求数据,完了之后要返回数据。然后,服务器需要知道我要搜索的是哪座城市的天气,因此,我还需要在data里面给定一个城市的数据,为city.接着,我需要获取这个数据,怎么获取?接收用户输入,诶,这里我们就明朗了,既然是接收用户输入,自然要用到v-model指令。我们把city绑定给v-model就好了。

这个时候自然就是需要在keyup.enter绑定的搜索天气的函数中实现请求部分的代码。这里很简单,还是按照那个固定格式来就行了。唯一需要注意的地方或许就是请求地址后面跟的参数,不能全部写在那个请求地址的字符串中,而应该要在后面加一个this.city.另外,你会发现光打印response,会出来一大堆东西,然后我们按F12键一层一层地去挖掘我们真正需要的数据。最后你会发现是response.data.data.forecast.

我们把这个打印出来就OK。

不过光这样显然不太行,因为我们不仅仅希望把这串信息打印出来,还希望它能够在搜索框的下面显示。这也很简单,我们弄一个表单,并且用v-for指令循环生成逐个打印就可以了。这时,需要用到渲染,我们在数据中添加一个数组,刚开始自然是赋为空,而我们之前拿到的response.data.data.forecast其实就是个数组,把这个在请求数据后立刻赋给定义好的空数组就行了。自然,请求数据时this.后面指代的内容也会改变,因此在请求之前我们需要把它保存起来。

然后,那些热键肯定不是摆在那好看的,我们希望用户点击那四座城市也能显示天气。怎么做呢?很简单,再写一个函数,然后找到那四座城市的html代码,绑定上去就好了。函数要怎么写呢?首先,我们需要一个参数,表示的是城市,再把它赋给this.city就行,最后,怎么做?诶,我不是已经写好了一个搜索的函数吗?直接调不就完事了?哈哈。

代码:

html:

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>WeatherForecast</title>
</head>
<body>
    <div class="wrap" id="app">
        <div class="search_form">
            <div class="logo">
                <img src="logo.png" alt="logo">
            </div>
            <div class="form-group">
                <input type="text" @keyup.enter="searchWeather" v-model="city" class="input_text" placeholder="请输入查询天气的城市">
                <button class="input_submit" @click="searchWeather">查询</button>
            </div>
            <div class="hotkey">
                <a href="javascript:;" @click="changeCity('北京')">北京</a>
                <a href="javascript:;" @click="changeCity('上海')">上海</a>
                <a href="javascript:;" @click="changeCity('广州')">广州</a>
                <a href="javascript:;" @click="changeCity('深圳')">深圳</a>
            </div>
        </div>
        <ul class="weather_list">
            <li v-for="item in weatherList">
                <div class="info_type">
                    <span class="icon-font">{{ item.type }}</span>
                </div>
                <div class="info_temp">
                    <b>{{ item.low }}</b>~<b>{{ item.high }}</b>
                </div>
                <div class="info_date">
                    <span>{{ item.date }}</span>
                </div>
            </li>
        </ul>
    </div>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="main.js"></script>
</body>
</html>

 

JS部分:

var app = new Vue({
    el:"#app",
    data:{
        city:" ",
        weatherList:[]
    },
    methods:{
        searchWeather:function () {
            var that = this;
            axios.get("http://wthrcdn.etouch.cn/weather_mini?city="+this.city).then(function (response) {
                that.weatherList = response.data.data.forecast;
                console.log(response.data.data.forecast);
            }, function (err) {
                console.log(err);
            })
        },
        changeCity:function (city) {
            this.city = city;
            this.searchWeather();
        }
    }
})

效果长这样(虽然有点丑):

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM