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

React天气应用中如何实现表单组件与WeatherApp组件的数据传递

React天气应用中如何实现表单组件与WeatherApp组件的数据传递

嘿,我看了你的代码,发现几个小调整就能让表单和WeatherApp组件顺利完成数据传递啦,咱们一步步来:

1. 正确引入并传递Form组件

你在WeatherApp里把Form组件注释掉了,首先要把它加回来,并且把定义好的handleQueryChange方法作为props传给Form——因为你的Form组件接收的props就是handleQueryChange,不是onSubmit。修改WeatherApp里的这段:

<div className="formContainer">
  <Form handleQueryChange={handleQueryChange} /> {/* 去掉注释,传对props */}
</div>

2. 修正handleQueryChange函数的逻辑

你现在的handleQueryChange里写的是setQuery(data.location.name),但Form组件传过来的是用户输入的城市名称字符串,不是接口返回的data对象,所以这里直接把传入的城市名赋值给query就行:

const handleQueryChange = (city) => {
  setQuery(city); // 直接把用户输入的城市设为query
}

3. 修复useEffect的无限循环问题

你当前的useEffect依赖的是data,这会导致无限循环:每次fetch数据后setData更新data,触发useEffect再次fetch,周而复始。我们需要把依赖改成query——只有当用户输入新城市,query发生变化时,才去请求天气数据:

useEffect(()=>{
  const fetchWeatherData = async () => {
    try {
      const response = await fetch(`https://api.weatherapi.com/v1/forecast.json?key=95f0ddb3a06a4a358cf223933242311&q=${query}&days=10&aqi=yes&alerts=no`);
      const result = await response.json();
      setData(result);
      console.log(result);
    } catch (error) {
      console.error("Error fetching weather data:", error);
    }
  };
  fetchWeatherData();
}, [query]); // 把依赖从data改成query

4. 确认Form组件的逻辑没问题

你的Form组件已经写得很对了:用useState管理输入的城市名,handleChange更新state,handleSubmit阻止默认提交行为并调用父组件传过来的handleQueryChange传递城市名,这部分不用改~

这样调整后,用户在表单输入城市点击提交,城市名就会传递到WeatherApp的query状态,触发useEffect重新请求对应城市的天气数据,最终更新到data状态里,后续的Home等组件就能拿到最新的天气信息啦!

备注:内容来源于stack exchange,提问作者Azongo Ismail

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:54:52