当一个特殊的属性改变时,我想要更新渲染。这笔财产性收入来自父母。我创建了一个名为loader的useState,用于在有数据或没有数据时处理代码。如果loader为false,我的代码将调用API,如果为true,则呈现数据。首先,我以这种方式使用useEffect。它没有更新渲染
useEffect(() => {
callApi();
}, []);在那之后,我这样使用useEffect。props.coordinates是我的代码应该在更改后更新的属性。
  useEffect(() => {
    callApi();
    setLoader(false);
  }, [props.coordinates]);但是我的代码在循环中,并且我的API密钥被阻塞了。你能告诉我我的错误在哪里吗?
这是我的组件:
import React, { useEffect, useState } from "react";
import axios from "axios";
import ForcastHour from "./ForcastHour";
import "./WeatherHourlyForcast.css";
const WeatherHourlyForcast = (props) => {
  const [loader, setLoader] = useState(false);
  const [hourlyForcastData, setHourlylyForcastData] = useState(null);
  useEffect(() => {
    callApi();
    setLoader(false);
  }, [props.coordinates]);
  const showHourlyForcast = (response) => {
    console.log("showHourlyForcast", response.data.hourly);
    setHourlylyForcastData(response.data.hourly);
    setLoader(true);
  };
  function callApi() {
    let latitude = props.coordinates.lat;
    let longitude = props.coordinates.lon;
    const apiKey = "23422500afd990f6bd64b60f46cf509a";
    let units = "metric";
    let apiUrl = `https://api.openweathermap.org/data/2.5/onecall?lat=${latitude}&lon=${longitude}&appid=${apiKey}&units=${units}`;
    axios.get(apiUrl).then(showHourlyForcast);
    console.log("hourly", apiUrl);
  }
  if (loader) {
    return (
      <div className="row">
        <div className="col-md-6">
          <div className="row">
            {hourlyForcastData.map(function (hourlyforcast, index) {
              if (index < 4 && index > 0) {
                return (
                  <div
                    className="col-4 box-weather my-auto text-center"
                    key={index}
                  >
                    <ForcastHour data={hourlyforcast} />
                  </div>
                );
              }
            })}
          </div>
        </div>
        <div className="col-md-6">
          <div className="row">
            {hourlyForcastData.map(function (hourlyforcast, index) {
              if (index < 7 && index > 3) {
                return (
                  <div
                    className="col-4 box-weather my-auto text-center"
                    key={index}
                  >
                    <ForcastHour data={hourlyforcast} />
                  </div>
                );
              }
            })}
          </div>
        </div>
      </div>
    );
  } else {
    callApi();
    return null;
  }
};
export default WeatherHourlyForcast;发布于 2021-09-30 08:49:02
在将依赖数组添加到useEffect (或任何其他钩子...)的末尾时,如果值不等于前一个值,则每次呈现时,钩子将再次运行。
因为props.coordinates是一个对象,并且在JS objA != objA == true中,即使属性没有改变,React也无法知道这一点。
我的建议是使用值本身(假设它们是字符串、数字等等)
  useEffect(() => {
    (async () => {
      await callApi();
      setLoader(false);
   })()
  }, [props.coordinates.lat, props.coordinates.lon]);您可能会遇到的另一件事是在callApi完成之前将调用setLoader(false),因此将异步行为添加到挂钩中
发布于 2021-09-30 08:50:39
您可以像这样编写组件,并在组件挂载时调用API。当lat和lon的值发生变化时,就会发生API调用。
import React, { useEffect, useState } from "react";
import axios from "axios";
import ForcastHour from "./ForcastHour";
import "./WeatherHourlyForcast.css";
const WeatherHourlyForcast = (props) => {
  const { coordinates : { lat, lon } } = props;
  const [loader, setLoader] = useState(false);
  const [hourlyForcastData, setHourlylyForcastData] = useState(null);
  useEffect(() => {
    callApi();
  }, [lat, lon]); //It's call the API's when the lat, lon values are changed
  const callApi = () => {
    setLoader(true);
    const latitude = lat;
    const longitude = lon;
    const apiKey = "23422500afd990f6bd64b60f46cf509a";
    const units = "metric";
    const apiUrl = `https://api.openweathermap.org/data/2.5/onecall?lat=${latitude}&lon=${longitude}&appid=${apiKey}&units=${units}`;
    axios.get(apiUrl).then((response) => {
      console.log(response.data);
      console.log(response.status);
      console.log(response.statusText);
      console.log(response.headers);
      console.log(response.config);
      console.log("showHourlyForcast", response.data.hourly);
      setHourlylyForcastData(response.data.hourly);
      setLoader(false);
    });
  };
  if (loader) {
    return (
      <div>
        <h1>Loading...</h1>
      </div>
    );
  }
  return (
    <div className="row">
      <div className="col-md-6">
        <div className="row">
          {hourlyForcastData.map(function (hourlyforcast, index) {
            if (index < 4 && index > 0) {
              return (
                <div
                  className="col-4 box-weather my-auto text-center"
                  key={index}
                >
                  <ForcastHour data={hourlyforcast} />
                </div>
              );
            }
          })}
        </div>
      </div>
      <div className="col-md-6">
        <div className="row">
          {hourlyForcastData.map(function (hourlyforcast, index) {
            if (index < 7 && index > 3) {
              return (
                <div
                  className="col-4 box-weather my-auto text-center"
                  key={index}
                >
                  <ForcastHour data={hourlyforcast} />
                </div>
              );
            }
          })}
        </div>
      </div>
    </div>
  );
};
export default WeatherHourlyForcast;https://stackoverflow.com/questions/69389000
复制相似问题