在这个天气应用程序中,我希望用户在"Body"组件中键入一个城市,并通过更新"results"组件来显示城市的天气结果.

当我将搜索查询从"Body"导出为prop cityProp={this.state.city}时,我很难将其存储为{this.state.city}存储到API调用中.

我能够访问并将输入的城市名称记录到控制台.但是,提交它似乎对显示的位置没有影响.

目标是显示输入城市的温度.

应用程序:

import "./App.css";
import Header from "./Header";
import Body from "./Body";

function App() {
  return (
      <div>
        <Header />
        <Body />
      </div>
  );
}

export default App;

正文:

import React, { Component } from "react";
import "./App.css";
import Results from "./Results";
import { useState } from "react";

class Body extends Component {
  constructor(props) {
    super(props);
    this.state = { city: "London" };
  }
  handleCityChange = (e) => {
    this.setState({ city: e.target.value });
  };

  handleSubmit = (e) => {
    e.preventDefault();
    // this.setState({ city: e.target.value });
  };

  render() {
    return (
      <div >
        <form className="SearchForm" onSubmit={this.handleSubmit}>
          <label>
            <input
              value={this.state.city}
              onChange={this.handleCityChange}
            ></input>
            <button>Go</button>
          </label>
        </form>
        <Results cityProp={this.state.city} />
      </div>
    );
  }
}
export default Body;

结果:

import "./App.css";
import React from "react";
import { useState, useEffect } from "react";

const Results = (props) => {
  const [forecast, setForecast] = useState([]);
  const [location, setLocation] = useState([]);

  useEffect(() => {
    const getWeather = async () => {
      try {
        fetch(
          `http://api.weatherapi.com/v1/forecast.json?key=47b6acea5d204134b4661938220707&q="${props.cityProp}"&days=3&aqi=no`
        ).then((response) => {
          response.json().then((data) => {
            setForecast(data.forecast);
            setLocation(data.location);
          });
        });
      } catch (err) {
        console.log("Error");
      }
    };
    getWeather();
  }, []);

  const renderedContent = forecast.forecastday
    ? forecast.forecastday.map((item) => {
        return (
          <div key={item.date_epoch}>
            <div>{item.day.maxtemp_c}</div>
          </div>
        );
      })
    : null;

  return (

      <div>{renderedContent}</div>

  );
};

export default Results;

推荐答案

cityProp更新时,Result组件中的效果将不会运行,除非props 位于效果的依存关系数组中:

  useEffect(() => {
    const getWeather = async () => {
      try {
        fetch(
          `http://api.weatherapi.com/v1/forecast.json?key=47b6acea5d204134b4661938220707&q="${props.cityProp}"&days=3&aqi=no`
        ).then((response) => {
          response.json().then((data) => {
            setForecast(data.forecast);
            setLocation(data.location);
          });
        });
      } catch (err) {
        console.log("Error");
      }
    };
    getWeather();
  }, [props.cityProp]);

Reactjs相关问答推荐

Shadck/ui Select -当用户 Select 项目时更改状态

根据另一个Select中的选定值更改Select中的值

一键MUI导出

Next.js Next-Auth登录函数重定向到http://localhost:3000/api/auth/error

Reaction Google Maps API无法获取标题

Reaction上下文值无法传递给其他组件

useRef()的钩子调用无效

ReactJS 共享上下文

在MongoDB中,如何获取最后N条记录中字段不为空或不为空字符串的数据

如何在PrimeReact的表格中修改筛选图标功能

useEffect 渲染没有依赖数组的组件

在 Nextjs13 应用程序目录中呈现从 supabase 获取的数据

如何在悬停时更改 MUI 卡内容

为什么 setState 在 React 中不是异步的?

错误:无效挂钩调用.钩子只能在函数组件的主体内部调用.使用 next/router 时

如何使用 cypress 获取 MUI TextField 的输入值?

react 页面更新

为什么我在运行一些 npm react 命令时会收到这些警告?

npm init vite@latest 和 npm init vite 有什么区别?

useEffect 仅在跟随链接后有效,不适用于直接链接