查天气(Vue.js,Element UI)

news2024/10/6 22:22:33

 演示图

几点注意

  1. 有亿点简陋,凑合能用,button一定要 !important 覆盖原本的 element ui ,不然无效
  2. axios回调函数中 this 指向改变了,需要额外的保存一份
  3. 服务器返回的数据比较复杂时,获取的时候需要注意层级结构
  4. methods 中定义的方法内部,可以通过 this 关键字点出其他的方法
  5. 使用的是和风天气API,可以免费申请哦

完整代码

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>查天气</title>
    <link rel="stylesheet" href="css/index.css" />
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">

</head>

<body>
    <div id="app">
        <div class="logo"><img src="img/logo.png" alt="logo" /></div>
        <div class="header">
            <!-- 搜索框 -->
            <div class="input_group">
                <el-input class="input_border" v-model="city" placeholder="请输入查询的城市"
                    @keyup.enter.native="queryWeather"></el-input>
                <el-button class="input_sub" @click="queryWeather">搜索</el-button>
            </div>

            <!-- 热门城市 -->
            <el-row class="hotkey-container">
                <el-tag class="hotkey" v-for="city in hotCitys" :key="city" @click="clickSearch(city)">{{ city
                    }}</el-tag>
            </el-row>
        </div>

        <!-- 天气列表 -->
        <ul class="weather_list">
            <li v-if="weatherData" v-for="(day, index) in weatherData" :key="index">
                <!-- 天气 -->
                <div class="info_type">
                    <span class="iconfont">{{ day.textDay }}</span>
                </div>
                <!-- 温度 -->
                <div class="info_temp">
                    <b>{{ day.tempMin }}</b> ~ <b>{{ day.tempMax }}</b> °C
                </div>
                <!-- 日期 -->
                <div class="info_date">
                    <span>{{ day.fxDate }}</span>
                </div>
                <!-- 空气质量 -->
                <div class="quality">
                    <p>空气质量指数: {{ airQualities[index].aqi }}</p>
                    <p>空气质量级别: {{ airQualities[index].category }}</p>
                </div>
            </li>
        </ul>


    </div>
    <!-- 开发环境版本,包含了有帮助的命令行警告 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <script src="https://unpkg.com/element-ui/lib/index.js"></script>
    <script src="./查天气.js"></script>

</body>
</html>

css 

/* 设置 Logo 图片的样式 */
.logo img {
    display: block;
    /* 将图片显示为块级元素 */
    weight: 130px;
    height: 130px;
    margin: 30px auto;
    /* border: #666 1px solid; */
}

/* 搜索框和热门城市 */
.header {
    width: 600px;
    margin: 0 auto;
}

/* 设置表单组的样式 */
.input_group {
    display: flex;
}

/* 设置文本输入框的样式 */
.input_border {
    width: 500px;
}

/* 设置提交按钮的样式 */
.input_sub {
    width: 100px;
    color: #fff !important;
    background-color: #dca6e2 !important;
    /* 使用 !important 来覆盖 Element UI 默认样式 */
}


/* 热门城市容器 */
.hotkey-container {
    /* margin:0 auto; */
    width: 310px;
}

/* 热门城市 */
.hotkey {
    margin: 2px;
    cursor: pointer;
    color: #fff !important;
    background-color: #e3b7df !important;
}

/* 热门城市,搜索按钮点击变暗 */
.hotkey:active,
.input_sub:active {
    opacity: 0.8; /* 设置点击时的透明度 */
}

/* 设置天气列表的样式 */
.weather_list {
    /* border: 1px solid #cc91d3; */
    height: 200px;
    text-align: center;
    /* 文字居中 */
    margin-top: 50px;
    font-size: 0px;
    /* 字体大小为0,避免列表项之间出现间隙 */
}

/* 设置天气列表中每个天气项的样式 */
.weather_list li {
    display: inline-block;
    /* 内联块元素 */
    color: #E38EFF;
    font-size: 33px;
    line-height: 40px;
    width: 180px;
    height: 250px;
    padding: 0 10px;
    overflow: hidden;
    position: relative;
    /* 相对定位 */
    background: url('../img/line.png') right center no-repeat;
    background-size: 1px 200px;
    /* border:1px solid #666; */
}

/* 最后一个天气列表项不显示背景 */
.weather_list li:last-child {
    background: none;
}

/* 设置天气温度的样式 */
.info_temp {
    font-size: 18px;
    color: #f692ce;
    /* border:1px solid #8e3a3a; */
}

/* 日期 */
.info_date {
    width: 100%;
    color: #999;
    font-size: 16px;
    /* border:1px solid #8e3a3a; */
}


/* 设置空气质量的样式 */
.quality {
    position: absolute;
    /* 绝对定位 */
    left: 0;
    /* 左边距为0 */
    top: 122px;
    line-height: 15px;
    color: #666;
    /* 文字颜色 */
    font-size: 15px;
    /* 文字大小 */
    width: 100%;
    /* 宽度100% */
    text-align: center;
    /* 文字居中对齐 */
    /* border:1px solid #8e3a3a; */
}

 js

new Vue({
    el: "#app",
    data: {
        city: "北京",
        weatherData: null,
        airQualities: null, // 添加空气质量数据
        hotCitys: ["北京", "上海", "广州", "深圳"],
        apiKey: "xxxxxxx" // 直接将 API 密钥硬编码到 JavaScript 中
    },
    methods: {
        // 查询天气
        queryWeather() {
            axios
                .get(`https://geoapi.qweather.com/v2/city/lookup?key=${this.apiKey}&location=${encodeURIComponent(this.city)}`)
                .then(res => {
                    const locationData = res.data.location[0];
                    const cityId = locationData.id;
                    // 获取天气数据
                    this.fetchWeatherData(cityId);
                    // 获取空气质量数据
                    this.fetchAirQuality(cityId);
                })
                .catch(err => {
                    console.log(err);
                });
        },
        // 获取天气数据
        fetchWeatherData(cityId) {
            axios
                .get(`https://devapi.qweather.com/v7/weather/3d?key=${this.apiKey}&location=${cityId}`)
                .then(res => {
                    this.weatherData = res.data.daily;
                })
                .catch(err => {
                    console.log(err);
                });
        },
        // 获取空气质量数据
        fetchAirQuality(cityId) {
            axios
                .get(`https://devapi.qweather.com/v7/air/5d?key=${this.apiKey}&location=${cityId}`)
                .then(res => {
                    this.airQualities = res.data.daily;
                })
                .catch(err => {
                    console.log(err);
                });
        },
        // 点击搜索
        clickSearch(city) {
            this.city = city;
            this.queryWeather();
        }
    }
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1602089.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

光伏电站智能勘探:无人机优势及流程详解

随着科技和互联网技术的不断发展&#xff0c;无人机在各个领域的应用越来越广泛&#xff0c;其中之一就是光伏电站智能勘探。利用无人机高清摄像头和传感器等设备&#xff0c;可以对光伏电站周边环境、日照情况、房屋状态进行全方面的勘探和记录&#xff0c;搭配卫星勘探、实地…

自动驾驶(八十四)---------中间件对比分析

很久没有写博客了&#xff0c;CSDN无故非法删了我第82篇&#xff0c;让我很恼火&#xff0c;一直提不起兴趣重新写一遍第82篇。但回初心&#xff0c;知识需要用自己的语言输出&#xff0c;所以今天对比分析自动驾驶中间件&#xff1a; 1. 中间件介绍 在自动驾驶架构中&#xf…

第14章 大数据与数据科学知识点梳理

第14章 大数据与数据科学知识点梳理&#xff08;附带页码&#xff09; ◼ 原则&#xff1a;组织应仔细管理与大数据源相关的元数据&#xff0c;以便对数据文件及其来源和价值进行准确的清单管理。P386 ◼ 大数据&#xff1a;数据量大&#xff08;Volume&#xff09;、数据更新…

嵌入式中C++指针使用方法总结

各位开发者大家好,在分享指针之前,先来看一下int *p[3]和int (*p)[3] 的区别。 int *p[3] p是一个数组,此数组有3个元素,每个元素都是int*类型,也就是指向整型数据的指针类型。 int a=10,b=20,c=30; int*p[3]={&a,&b,&c}; 而int(*p)[3]中的p是一个指向数组的…

浅谈Java的synchronized 锁以及synchronized 的锁升级

在Java中&#xff0c;synchronized关键字用于实现线程间的同步&#xff0c;确保同一时刻只有一个线程能够访问被同步的代码块或方法。当一个线程获得synchronized锁定后&#xff0c;其他试图访问同一锁的线程将被阻塞&#xff0c;直到锁被释放。 synchronized锁有两种基本形式…

计算机网络实验实验之VLAN的配置与分析

实验目的 了解什么是带内管理&#xff1b;熟练掌握如何使用telnet方式管理交换机&#xff1b;熟练掌握如何为交换机设置web方式管理&#xff1b;熟练掌握如何进入交换机web管理方式&#xff1b;了解交换机web配置界面&#xff0c;并能进行部分操作。 (6)了解VLAN原理&#xf…

python pygame事件与事件处理

本期是接上期python pygame库的略学内容最后一个步骤&#xff0c;游戏与玩家交互的内容。 一、什么是事件 游戏需要与玩家交互&#xff0c;因此它必须能够接收玩家的操作&#xff0c;并根据玩家的不同操作做出有针对性的响应。程序开发中将玩家会对游戏进行的操作称为事件&…

微服务架构与Dubbo

一、微服务架构 微服务架构是一种架构概念&#xff0c;旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。 分布式系统式若干独立系统的集合&#xff0c;但是用户使用起来好像是在使用一套系统。 和微服务对应的是单体式开发&#xff0c;即所有的功能打包在一个WAR…

关于CRMEB 商城系统商业授权的那些事儿

现在&#xff0c;很多时候我们都会听到“授权”这个词&#xff0c;在CRMEB的商城系统产品中&#xff0c;商业授权也是一个重要环节&#xff0c;今天&#xff0c;我们就来了解一下关于CRMEB商城系统授权的那些事儿。 一、为什么要进行商业授权&#xff1f; 正版商业授权是对用户…

【Linux】详解如何利用共享内存实现进程间通信

一、共享内存&#xff08;Shared Memory&#xff09;的认识 共享内存&#xff08;Shared Memory&#xff09;是多进程间共享的一部分物理内存。它允许多个进程访问同一块内存空间&#xff0c;从而在不同进程之间共享和传递数据。这种方式常常用于加速进程间的通信&#xff0c;因…

软考130-上午题-【软件工程】-系统维护

一、系统维护概述 软件维护是软件生命周期中的最后一个阶段&#xff0c;处于系统投入生产性运行以后的时期中&#xff0c;因此不属于系统开发过程。 软件维护是在软件已经交付使用之后为了改正错误或满足新的需求而修改软件的过程&#xff0c;即软件在交付使用后对软件所做的一…

李沐-19 卷积层【动手学深度学习v2】

记录下关于权重下标变换的理解&#xff1a; 从原来的Wi,j到Wi,j,k,l是从二维到四维的过程&#xff0c;如下图所示 对全连接层使用平移不变性和局部性得到卷积层&#xff0c;这是卷积层的引入&#xff0c;下方Vi,j,a,b--->Va,b表示了平移不变性&#xff0c;给a,b限制在||内保…

C语言 【函数】

1.函数概述 函数是一种可重用的代码块&#xff0c;用于执行特定任务或完成特定功能 函数作用&#xff1a;对具备相同逻辑的代码进行封装&#xff0c;提高代码的编写效率&#xff0c;实现对代码的重用 2. 函数的使用 2.1 无参无返回值 #include <stdio.h>// 函数名…

光纤收发器的注意事项

光纤收发器有各种不同的类别&#xff0c;而实际使用中最受关注的是根据光纤收发器的不同类别&#xff1a;SC连接器光纤收发器和FC/ST连接器光纤收发器。 当使用光纤收发器连接到不同的设备时&#xff0c;必须小心使用不同的端口。 1.光纤收发器与100Base TX设备&#xff08;交…

IP定位技术原理详细阐述

IP定位技术原理主要基于IP地址与地理位置之间的关联&#xff0c;通过一系列的技术手段&#xff0c;实现对网络设备的物理位置进行精确或大致的定位。以下是对IP定位技术原理的详细阐述。 首先&#xff0c;我们需要了解IP地址的基本概念。IP地址是互联网协议地址的简称&#xff…

【leetcode】双指针算法技巧——滑动窗口

标题&#xff1a;【leetcode】双指针算法技巧——滑动窗口 水墨不写bug 正文开始&#xff1a; 滑动窗口介绍 滑动窗口是一种常用的算法技巧&#xff0c;用于解决一些涉及 连续子数组或子串 的问题。它的基本思想是 维护一个窗口&#xff0c;通过 在窗口内移动 来寻找满…

LeetCode刷题总结 | 图论3—并查集

并查集理论基础 1.背景 首先要知道并查集可以解决什么问题呢&#xff1f; 并查集常用来解决连通性问题。大白话就是当我们需要判断两个元素是否在同一个集合里的时候&#xff0c;我们就要想到用并查集。 并查集主要有两个功能&#xff1a; 将两个元素添加到一个集合中。判…

Day18_学点儿设计模式_MVC和三层架构

0 优质文章 MVC与三层架构 什么是MVC&#xff1f;什么是三层架构&#xff1f; 三层架构与MVC详细讲解 MVC三层架构&#xff08;详解&#xff09; 1 MVC MVC全名是Model View Controller&#xff0c;是模型(model)&#xff0d;视图(view)&#xff0d;控制器(controller)的缩写…

【Vue3】setup语法糖的使用

文章目录 setup简介使用vite-plugin-vue-setup-extend插件 指定组件名字 setup简介 <script setup> 是在单文件组件 (SFC) 中使用组合式 API 的编译时语法糖 相比较普通的<script> ,它有以下优势&#xff1a; 更少的样板内容&#xff0c;更简洁的代码。能够使用纯…

图论学习总结

文章目录 图论学习总结前言一、基础知识图的存储图的遍历 二、最短路多源最短路 F l o y d Floyd Floyd​ 算法例题及变形** e g 1 &#xff1a; S o r t i n g I t A l l O u t eg1&#xff1a;Sorting\ It\ All\ Out eg1&#xff1a;Sorting It All Out ( A c W i n g 343 /…