You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过收藏按钮将城市天气数据存入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:58:08