如何通过收藏按钮将城市天气数据存入LocalStorage并展示?
嘿,我完全懂你卡在这两步的烦躁——LocalStorage的存取细节和动态渲染卡片确实容易让人卡壳,我来给你梳理一套落地的方案,直接照着改就能用!
第一步:搞定LocalStorage的收藏逻辑
首先要明确:LocalStorage只能存字符串,所以我们得把天气对象转成JSON字符串存进去,取的时候再转回来。另外还要处理重复收藏和最多5个收藏的限制,不然会出现重复卡片或者超出数量的问题。
这里给你写个封装好的收藏函数:
// 保存城市到收藏夹 function saveCityToFavorites(weatherInfo) { // 先从LocalStorage拿已有的收藏数据,没有就初始化空数组 let savedFavorites = JSON.parse(localStorage.getItem('weatherFavorites')) || []; // 检查这个城市是不是已经收藏过了 const isCitySaved = savedFavorites.some(item => item.city === weatherInfo.city); if (isCitySaved) { alert("这个城市已经在收藏里啦!"); return; } // 控制最多5个收藏 if (savedFavorites.length >= 5) { alert("最多只能收藏5个城市哦~"); return; } // 把新的天气数据加进去,再存回LocalStorage savedFavorites.push(weatherInfo); localStorage.setItem('weatherFavorites', JSON.stringify(savedFavorites)); // 存完立刻更新页面上的收藏卡片 renderFavoriteCards(); }
第二步:循环渲染5个收藏卡片
接下来是把LocalStorage里的数据渲染到页面的5个收藏卡片上。这里要注意:如果收藏数不足5,剩下的卡片要显示占位内容;如果有收藏就填充数据,还要加取消收藏的功能。
先写渲染函数:
// 渲染收藏卡片 function renderFavoriteCards() { // 假设你的5个收藏卡片容器的id是"favorite-cards-container" const cardsContainer = document.getElementById("favorite-cards-container"); const savedFavorites = JSON.parse(localStorage.getItem('weatherFavorites')) || []; // 先清空容器里的旧内容,避免重复渲染 cardsContainer.innerHTML = ""; // 循环生成5张卡片 for (let i = 0; i < 5; i++) { const card = document.createElement("div"); card.classList.add("weather-card"); // 用你自己定义的卡片样式类 if (savedFavorites[i]) { // 有收藏数据就填充内容 const { city, temp, desc } = savedFavorites[i]; // 这里的字段要和你存的天气数据对应 card.innerHTML = ` <h4>${city}</h4> <p>温度:${temp}°C</p> <p>天气:${desc}</p> <button onclick="removeFavorite(${i})">取消收藏</button> `; } else { // 没有数据就显示占位 card.innerHTML = "<p>点击收藏城市~</p>"; } cardsContainer.appendChild(card); } } // 取消收藏的函数 function removeFavorite(index) { let savedFavorites = JSON.parse(localStorage.getItem('weatherFavorites')) || []; savedFavorites.splice(index, 1); // 删除对应索引的收藏 localStorage.setItem('weatherFavorites', JSON.stringify(savedFavorites)); renderFavoriteCards(); // 重新渲染卡片 }
第三步:绑定复选框的触发事件
最后把收藏函数和你的复选框关联起来,比如用户勾选“收藏”时,把当前搜索到的天气数据传进去:
// 假设你的收藏复选框id是"favorite-checkbox" const favoriteCheckbox = document.getElementById("favorite-checkbox"); // 假设你搜索到的天气数据存在searchResult变量里(比如从API返回的处理后的数据) favoriteCheckbox.addEventListener("change", function() { if (this.checked) { // 勾选时触发收藏 saveCityToFavorites(searchResult); } else { // 取消勾选时可以选择是否移除该城市,这里根据你的需求来,比如: // const targetIndex = savedFavorites.findIndex(item => item.city === searchResult.city); // removeFavorite(targetIndex); } });
别忘了页面加载时初始化!
最后在页面加载完成后调用渲染函数,这样刷新页面后收藏的内容不会消失:
window.addEventListener("load", renderFavoriteCards);
小提示:
- 确保你存的
weatherInfo数据结构是统一的,比如每个对象都包含city(城市名)、temp(温度)、desc(天气描述)这些字段,不然渲染的时候会出错。 - LocalStorage是存在用户浏览器里的,不同设备/浏览器不会共享数据,这个是正常的。
内容的提问来源于stack exchange,提问作者Gleisson Santos Silva
相关产品推荐
相关产品推荐

