【问题标题】:TypeError: oldCities is not iterableTypeError:oldCities 不可迭代
【发布时间】:2022-01-21 12:52:48
【问题描述】:

我正在使用 React 在天气应用程序中工作,但我遇到了这个错误并且无法解决它

"TypeError: oldCities 不可迭代"

这是我的完整代码:

import React, { useState } from 'react';
import './App.css';
import Nav from './components/Nav';
import Cards from './components/Cards.jsx'

export default function App() {

  const [cities, setCities] = useState()

  console.log(setCities)

  const apiKey = 'api_key'

  function onSearch(city){
    fetch(`http://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric`)
      .then(response => response.json())
      .then(json => {
        if(json.main !== undefined){
          const city = {
            min: Math.round(json.main.temp_min),
            max: Math.round(json.main.temp_max),
            id: json.id,
            img: json.weather[0].icon,
            wind: json.wind.speed,
            temp: json.main.temp,
            name: json.name,
            logitude: json.coord.lon,
            latitude: json.coord.lat
          };
          setCities(oldCities => [...oldCities, city])
        }
        else{
          alert('Ciudad no encontrada')
        }
      })
      .catch(e => console.log(e))
  }

  return (
    <div className="App">
      { /* Tu código acá: */ }
      <Nav onSearch={onSearch} />
      <Cards cities={cities} />
    </div>
  );
}

关于如何以不同方式将数据添加到 setCities 的想法?

【问题讨论】:

  • 请说明您在哪里创建和设置 oldCities
  • 在某些时候它不再是一个可迭代的项目
  • 我在 setCities 的箭头函数中创建 oldCities,使用 console.log(oldcities) 显示为“未定义”,但问题是按照教程它应该可以在没有和问题的情况下工作跨度>
  • oldCities 的类型是数组吗??
  • 是的,但 oldCities 是状态变量城市的旧值。您必须在某处展示它

标签: javascript reactjs promise frontend es6-promise


【解决方案1】:

由于您正在使用 React,我假设您的代码如下所示

const [oldCities, setCities] = useState([])

我不确定 oldCities 的用途是什么,但如果您想附加您从 API 调用中获得的城市 val,它应该是

setCities([...oldCities, new_city ])  // Append to cities array
// Note here to not use oldCities.append
// bc it will preserve the memory address of the array
// and hence not update the component state

【讨论】:

  • setCities([...oldCities, new_city ]) 也显示错误,因为未定义旧城市,我已使用完整代码编辑了帖子
  • @SantiagoSaavedra 您需要为您的状态设置默认值,例如在我的回答中使用useState([]) 而不是useState(),因为最新版本会将 oldCities 值设置为“未定义”而前者将将其设置为一个空数组,这将与您的代码一起正常工作
  • 没错!将近一个小时的时间来搜索代码发生了什么,只是那些 [ ] 我没有意识到丢失的地方。现在感觉好傻啊!!!!非常感谢老兄!
  • 有一个免费的公共天气api,叫做weatherDB,实现起来比较简单,可以试一试。网站:weatherdbi.herokuapp.com
猜你喜欢
  • 2019-08-15
  • 2011-02-18
  • 2017-02-21
  • 2015-03-06
  • 2018-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多