【问题标题】:how to destructure object of arrays from api and put into state?如何从 api 解构数组对象并放入状态?
【发布时间】:2021-09-09 08:50:29
【问题描述】:

所以基本上我正在学习如何调用 api,并且我在搞乱开放的天气 api,试图显示几个不同城市的名称和温度。问题是响应是数组的对象,并试图将所有城市的名称放入状态,以便我可以显示它们。让所有名称进入状态的最佳方法是什么?

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

function App() {
    const [cityName, setCityName] = useState("");
    const [temp, setTemp] = useState("");
    const [description, setDescription] = useState("");

    const fetchData = () => {
        //api variables (normily stored somewhere safer)
        const lat = "35.320696399999996";
        const lon = "-75.8232391";
        const key = "115475ac7a8dda2a7e7ec0b27b93ce35";
        const cnt = "5";
        const url = `https://api.openweathermap.org/data/2.5/find?lat=${lat}&lon=${lon}&cnt=${cnt}&appid=${key}`;

        axios
            .get(url)
            .then((res) => {
                
                console.log(res.data.list);
            })
            .catch((err) => {
                console.log(err);
            });
    };

    useEffect(() => {
        fetchData();
    }, []);

    return <div className="App"></div>;
}
export default App;

【问题讨论】:

  • 那么从对象数组的响应中,您需要城市名称、温度和描述吗?您能否提供示例结果或您希望从响应中解析出的内容?您的州都是空字符串,但您的问题暗示您想要一个包含城市、临时工和描述的数组。
  • 对,所以我想在 cityName 州我想要 ["Buxon", "Swanquarter","Dare","Wanchese","manteo"] 所以我可以在下面映射它们并渲染他们在页面上。我会将状态更改为空数组,但我知道如何为其设置名称的唯一方法是 setState(res.data.list[0}.name) 但我不想为每个人都这样做城市。
  • 您想要为每个单独的数组,还是一个具有您想要的属性的对象数组就足够了? (在 JSX 中映射单个数组会更容易)描述是什么?是来自响应数据吗?
  • 单个数组是我想要为 JSX 映射的。描述也是响应,但它嵌套在天气对象中,编辑后显示它。

标签: javascript reactjs api axios fetch


【解决方案1】:

您可以将响应列表映射到具有所需属性的新数组。更新您的组件,使其拥有一个“数据”状态数组来保存映射的响应值。

const [data, setData] = useState([]);

const fetchData = () => {
  
  ...

  axios
    .get(url)
    .then((res) => {
      console.log(res.data.list);

      // destructure name, main.temp, and weather
      const data = res.data.list.map(({ name, main: { temp }, weather }) => {
        // weather is an array of length 1, but still provide fallback
        const { description } = weather[0] ?? {};

        return {
          description,
          name,
          temp,
        };
      });

      setData(data);
    })
    .catch((err) => {
      console.log(err);
    });
};

useEffect(() => {
    fetchData();
}, []);

【讨论】:

  • 谢谢,工作完美。我不明白解构语法是如何工作的,我得看一个视频。
  • @Brandon IMO 它相当简单,您可以解构并分配value 属性,即const { value } = obj,而不是const value = obj.value。这有点速记。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
猜你喜欢
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 2018-11-08
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多