Vue3 + Axios 实现一个精美天气组件(含实时与未来预报)

Vue3 + Axios 实现一个精美天气组件(含实时与未来预报)

一、前言

在很多管理系统、信息看板、门户首页中,天气模块是一个常见的小组件。
它不仅能展示当前的气温、天气状况,还能提供未来几天的天气趋势,让用户对环境有更好的感知。

今天我们就用 Vue3 + Axios,实现一个能够自动定位并展示实时天气和未来预报的天气组件。
并且我们会配上相应的天气图标,让界面更美观。


二、效果预览

组件会自动获取当前城市的天气:

  • 实时天气(温度 + 天气图标)
  • 今日最高/最低温度
  • 未来 5 天天气预报
  • 自动根据天气文字匹配相应的图片

在这里插入图片描述


三、实现思路

  1. 数据来源
    我们使用 心知天气 API(https://seniverse.com/)来获取天气数据,location=ip 参数可以根据用户的 IP 自动定位城市。

  2. 技术栈

    • Vue3(组合式 API)
    • Axios(请求 API 数据)
    • SCSS(美化界面)
    • 图片资源(天气图标)
  3. 功能逻辑

    • axios.get 分别请求 实时天气未来天气
    • 将获取的数据存入 Vue3 的 ref 响应式变量。
    • 根据天气文字选择对应的图标(如“晴”、“小雨”、“暴雪”等)。
    • v-for 循环渲染未来天气列表。

四、代码实现

<template><div class="weather"><!-- 地址信息 --><div class="address"><img src="@/assets/index/weather/address.png" alt="" /><span>{{ weatherData.location.name }}</span> <!-- 城市名称 --></div><!-- 当前气候信息 --><div class="climate"><!-- 天气图标 --><img class="climate-icon" :src="getWeatherIcon(weatherData.now.text)" alt="" /><!-- 温度 --><div class="wendu">{{ weatherData.now.temperature }}<span>℃</span></div><!-- 今日最高/最低气温 + 空气质量 --><div class="today"><div class="label"><span>今天</span><span>{{ text }}</span> <!-- 天气描述(如晴、阴、雨等) --></div><div class="value"><span class="value-text">{{ future.daily[0].high }}/{{ future.daily[0].low }}℃</span><div class="quality"><span class="quality-icon"></span><span class="quality-text">优</span> <!-- 空气质量(这里写死为优) --></div></div></div></div><!-- 未来几天天气 --><div class="future"><template v-for="(item, index) in future.daily" :key="index"><div class="future-item"><!-- 天气图标(白天) --><img :src="getWeatherIcon(item.text_day)" alt="" /><div class="future-box"><div class="box-label">{{ parseTime(item.date, "{m}月{d}日") }}</div><div class="box-value">{{ item.high }}/{{ item.low }}℃</div></div></div><!-- 分隔线,最后一天不画 --><div class="future-line" v-if="index !== future.daily.length - 1"></div></template></div></div>
</template><script setup name="Weather">
import axios from "axios";// 当前天气数据(实时)
const weatherData = ref({location: {},now: {},
});// 未来天气数据(默认值避免渲染时报错)
const future = ref({location: {},daily: [{high: "30",low: "10",},],
});// 根据天气描述返回对应的图标路径
const getWeatherIcon = (text) => {let img = "晴"; // 默认是晴天switch (text) {case "晴": img = "晴"; break;case "暴雨": img = "暴雨"; break;case "雷阵雨": img = "雷阵雨"; break;case "雷阵雨伴有冰雹": img = "雷阵雨伴有冰雹"; break;case "大暴雨": img = "特大暴雨"; break;case "特大暴雨": img = "特大暴雨"; break;case "雾": img = "雾"; break;case "小雨":case "中雨":case "大雨": img = "下雨"; break;case "阵雪": img = "阵雪"; break;case "小雪":case "中雪":case "大雪": img = "雪"; break;case "暴雪": img = "暴雪"; break;case "风":case "大风": img = "风"; break;case "飓风":case "热带风暴":case "龙卷风": img = "风"; break;case "雨夹雪": img = "雨夹雪"; break;default: break;}// 返回图片路径(Vite 的 new URL 写法)return new URL(`../../assets/index/weather/${img}.png`, import.meta.url).href;
};// 获取天气数据(调用心知天气 API)
const getList = () => {// 当前天气axios.get("https://api.seniverse.com/v3/weather/now.json?key=SjyiLD_odjCGOsHoF&location=ip&language=zh-Hans&unit=c").then((res) => {weatherData.value = res.data.results[0];});// 未来 5 天的天气axios.get("https://api.seniverse.com/v3/weather/daily.json?key=SjyiLD_odjCGOsHoF&location=ip&language=zh-Hans&unit=c&start=0&days=5").then((res) => {future.value = res.data.results[0];});
};// 组件加载时调用一次
getList();
</script><style lang="scss" scoped>
.weather {width: 100%;height: 100%;padding: 5px 15px;background: url("@/assets/index/weather/bg.png") no-repeat;background-size: 100% 100%;/* 地址部分样式 */.address {display: flex;align-items: center;img {width: 14px;height: 17px;margin-right: 5px;}span {font-family: PingFang SC;font-size: 12px;color: #cce6f8;}}/* 当前气候部分样式 */.climate {display: flex;align-items: center;margin: 8px 0;.climate-icon {width: 60px;margin-right: 5px;}.wendu {font-size: 50px;font-weight: 600;color: #ffffff;margin-right: 20px;line-height: 1;span {font-size: 20px;}}.today {.label {width: 75px;font-size: 16px;color: #ffffff;display: flex;justify-content: space-between;}.value {display: flex;align-items: center;.value-text {font-size: 18px;color: #ffffff;margin-right: 10px;}.quality {padding: 0 10px;height: 20px;background: #67baee;border-radius: 10px;.quality-icon {width: 9px;height: 9px;border-radius: 50%;background: #51cfa4;border: 1px solid #ffffff;margin-right: 4px;display: inline-block;}.quality-text {font-size: 14px;color: #ffffff;}}}}}/* 未来天气部分 */.future {display: flex;justify-content: space-between;align-items: center;.future-item {display: flex;align-items: center;img {width: 36px;height: 36px;margin-right: 3px;}.future-box {.box-label {font-size: 12px;color: #cce6f8;}.box-value {font-size: 12px;color: #ffffff;}}}/* 中间的竖线分隔 */.future-line {width: 1px;height: 25px;background: #2794ea;margin: 0 auto;}}
}/* 针对屏幕宽度小于 1650px 时的样式优化 */
@media screen and (max-width: 1650px) {.weather .climate {.wendu {margin-right: 15px;}.today .value .quality {padding: 0 6px;}}
}
</style>

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

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

相关文章

Unity:GUI笔记(二)——工具栏和选择网格、滚动列表和分组、窗口、自定义皮肤样式、自动布局

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。五、工具栏和选择网格1、工具栏使用Unity提供的API&#xff1a;GUI.Toolbar()可以创建一个工具栏。有三个参数是必须…

Streamlit实现Qwen对话机器人

Web界面 一、Streamlit 是一个用于创建数据科学和机器学习应用的开源前端框架&#xff0c;能够快速将 Python 脚本转化为交互式 Web 应用。通过简单的 Python API 就能构建出交互式的数据应用。 1、主要特点 简单易用&#xff1a;纯 Python 编写代码&#xff0c;API 简洁直观…

Linux-地址空间

目录 1.介绍 2.理解 3.Linux早期的内核调度队列 1.介绍 这是32位的程序空间地址图&#xff1a; 为了更好地理解这段图&#xff0c;我们来写一段代码编译运行&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <std…

**标题:发散创新之力,探索隐私计算的未来**隐私计算,作为当下数字化时代的热门话题,正受

标题&#xff1a;发散创新之力&#xff0c;探索隐私计算的未来 隐私计算&#xff0c;作为当下数字化时代的热门话题&#xff0c;正受到越来越多开发者和从业者的关注。本文将带您走进隐私计算的奇妙世界&#xff0c;探讨其背后的技术原理、应用场景以及发展趋势。 一、隐私计算…

线程P5 | 单例模式[线程安全版]~懒汉 + 饿汉

什么是单例模式&#xff1f;在我们正式讲解单例模式之前&#xff0c;没有了解过的小伙伴可能会有疑问...到底啥叫单例模式&#xff1f;&#xff1f;其实单例模式呢&#xff0c;是我们设计模式中的一种&#xff0c;所谓的设计模式&#xff0c;你可以把它理解为一个模板&#xff…

kubernetes中数据存储etcd

etcd 在 Kubernetes 中的角色核心定位&#xff1a;Kubernetes 的 唯一持久化数据存储&#xff08;一致性数据库&#xff09;。职责&#xff1a; 保存整个集群的期望状态&#xff08;desired state&#xff09;&#xff0c;包括节点信息、Pod 清单、Service 定义、ConfigMap、Se…

Linux crontab定时任务

参考资料 【図解】cronの仕組み定时任务 - crontab解决ubuntu下定时任务不执行问题crontab环境变量问题&#x1f4a5;Linux定时任务功能详解&#xff1a;crontab与at命令应用指南 目录一. 环境准备1.1 wsl开启systemd1.2 开启cron日志二. cron服务管理相关命令2.1 service 的方…

企业频繁收到软件律师函?如何彻底解决这一难题

1. 引言&#xff1a;律师函频发&#xff0c;已成信息化管理的“隐形雷区”在工业制造、芯片、航空航天、船舶制造、医疗器械等高要求行业&#xff0c;软件不仅是研发与生产的关键工具&#xff0c;更是企业数据与知识产权安全的“底座”。然而&#xff0c;不少企业却在日常运营中…

在 macOS 上顺利安装 lapsolver

一、什么是 lapsolver&#xff1f; lapsolver 是一个用于求解线性分配问题&#xff08;Linear Assignment Problem, LAP&#xff09; 的 Python 库。线性分配问题是运筹学中的经典问题&#xff0c;核心是在两个集合&#xff08;如“工人”与“任务”&#xff09;之间找到一组最…

宋红康 JVM 笔记 Day02|JVM的架构模型、生命周期、发展历程

一、今日视频区间 P13-P25 二、一句话总结 JVM的架构模型&#xff1b;JVM的生命周期&#xff1b;JVM发展历程&#xff1b; 三、关键图/命令 3.1 JVM的架构模型Java程序对.class字节码文件进行反编译操作&#xff1a;在idea中先运行需要反编译的代码&#xff0c;找到对应的字节码…

Linux新手上路 | 在Ubuntu上Pluma文本编辑器的安装与基本使用

Linux新手上路 | 在Ubuntu上Pluma文本编辑器的安装与基本使用一、Pluma工具介绍1.1 Pluma 工具概述1.2 主要功能1.3 适用场景二、安装Pluma2.1 安装方法2.2 启动Pluma工具三、汉化方法3.1 安装汉化包3.2 设置系统语言3.3 重新打开Pluma四、基本使用方法4.1 编写文本内容4.2 关键…

React 揭秘:从新手到高手的进阶之路

目录 React&#xff1a;前端开发新宠​ React 初相识​ 什么是 React​ React 的核心特性​ 1.组件化开发 2.虚拟 DOM 与 Diff 算法 单向数据流 搭建 React 开发环境 环境准备​ 创建 React 项目 项目结构解析 React 基础语法与核心概念 JSX 语法​ 基本语法规则…

八股文小记 Servlet 过滤器-Spring MVC 拦截器-Spring AOP 拦截器区别

您对执行机制的洞察非常准确&#xff01;让我们深入分析这三种组件的调用机制及其与 AOP 节点的关系&#xff1a; 一、执行机制的本质区别组件调用机制实现原理Servlet 过滤器递归调用通过 FilterChain.doFilter() 显式递归调用下一个节点Spring MVC 拦截器遍历调用由 HandlerE…

qml 实现数值键盘

import QtQuick 2.0import QtQuick.Layouts 1.12 import"../pad" // PasswordKeyboard.qml import QtQuick 2.12ColumnLayout {id: keyboardspacing: 8// 键盘标题Text {text: "安全输入"font.pixelSize: 16color: "#666"Layout.alignment: Qt.A…

PID控制算法

文章目录引言一、基本原理1.1.简介1.2.开环与闭环1.3.PID 的公式1.3.1.比例项&#xff08;Proportional&#xff09;1.3.2.积分项&#xff08;Integral&#xff09;1.3.3.微分项&#xff08;Differential&#xff09;1.4.连续形式与离散形式的 PID 公式1.4.1.连续形式1.4.2.离散…

MyBatis 动态数据源切换在 Spring Boot 环境下的实现方案

第一章 需求背景与技术选型1.1 多数据源场景概述在大型企业级应用中&#xff0c;单一数据库往往无法满足高并发和多业务线的需求&#xff0c;因此需要引入 多数据源 的架构设计。常见的多数据源场景包括&#xff1a;读写分离、多租户、分库分表以及数据源负载均衡等。读写分离&…

PCA降维理论详解

文章目录一、什么是PCA&#xff1f;二、为什么需要降维&#xff1f;三、PCA的数学原理与详细推导视角一&#xff1a;最大化投影方差&#xff08;Maximizing Variance&#xff09;视角二&#xff1a;最小化重构误差&#xff08;Minimizing Reconstruction Error&#xff09;四、…

Android RxJava变换操作符详解

RxJava作为响应式编程在Android开发中的利器&#xff0c;其强大的变换操作符能够帮助我们优雅地处理数据流。本文将深入讲解RxJava中最常用的变换操作符及其实际应用场景。一、RxJava变换操作符概述变换操作符(Transformation Operators)用于对Observable发射的数据序列进行变换…

开源数据发现平台:Amundsen 快速上手指南

Amundsen 是一个数据发现和元数据引擎&#xff0c;旨在提高数据分析师、数据科学家和工程师与数据交互时的生产力。目前&#xff0c;它通过索引数据资源&#xff08;表格、仪表板、数据流等&#xff09;并基于使用模式&#xff08;例如&#xff0c;查询频率高的表格会优先于查询…

【密码学实战】国密SM2算法介绍及加解密/签名代码实现示例

引言 在信息安全领域&#xff0c;密码算法是数据保护的核心基石。2010 年&#xff0c;中国国家密码管理局发布了 SM2 椭圆曲线公钥密码算法&#xff0c;作为国产密码标准的核心成员&#xff0c;它凭借高效安全的特性&#xff0c;逐步替代 RSA 等国际算法&#xff0c;广泛应用于…