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

React天气应用切换单位按钮需双击问题求助

单位切换按钮双击生效问题修复

问题描述

开发了支持英制/公制单位切换的天气应用按钮,点击按钮会修改API URL参数并重新渲染天气展示组件。目前昼夜天气切换按钮点击即可立即生效,但公制与英制切换按钮从英制切回公制时需双击才能生效。

问题原因

你使用了普通变量toggle控制单位切换状态,但React组件每次重新渲染时,这个普通变量会被重置为初始值false,导致状态判断逻辑偏差:

  • 第一次点击切换到英制时,toggle变为true,设置英制API URL,组件重新渲染后toggle又被重置为false
  • 第二次点击时,toggle再次变为true,此时才触发公制URL的设置,因此需要双击才能生效

解决方案

将普通变量toggle替换为React的useState状态变量,让React管理状态的持久化和更新,确保组件重新渲染时状态不会丢失。

修改后的代码

状态定义部分

const [toggle, setToggle] = useState(false); // 替换原有的let toggle = false

const [displayedWeather, setDisplayedWeather] = useState(null);
const [loading, setLoading] = useState(false);
const [swapUnit, setUnits] = useState(`https://dataservice.accuweather.com/forecasts/v1/daily/5day/${key}?apikey=${apiKey}&details=true&metric=true`);
const [buttonText, setButtonText] = useState('metric');

单位切换函数部分

推荐使用函数式更新确保获取最新状态,避免状态滞后:

//Toggle between celsius and fahrenheit
function changeParams(e) {
  e.preventDefault();
  setToggle(prevToggle => {
    if (!prevToggle) {
      setButtonText('Metric');
      setUnits(`https://dataservice.accuweather.com/forecasts/v1/daily/5day/${key}?apikey=${apiKey}&details=true&metric=false`);
    } else {
      setButtonText('Imperial');
      setUnits(`https://dataservice.accuweather.com/forecasts/v1/daily/5day/${key}?apikey=${apiKey}&details=true&metric=true`);
    }
    return !prevToggle;
  });
}

修改后,每次点击按钮都会基于最新状态判断,确保单位切换一次点击即可生效。

内容的提问来源于stack exchange,提问作者trevinshu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 15:20:32