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
英文地址,請注明出處:http://en.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;廣泛應用于…