this.state.items.map не является функцией. Каким может быть решение?

#reactjs

#reactjs

Вопрос:

Я создаю простой код react, который показывает список данных API. Однако он возвращает мне ошибку «Uncaught TypeError: this.state.items.map не является функцией» в строке 27. Не могли бы вы сказать мне причину? Я просто изменил ключ API и название веб-сайта только по соображениям безопасности. Пожалуйста, помогите!

 import React from "react";

import Form from "./components/Form.js";


const API_KEY = "123123";
class App extends React.Component {
  //initialize state
  state = {
    items: []
  };

  getWeather = async (e) => {
    e.preventDefault();
    const city = e.target.elements.city.value;
    const state = e.target.elements.state.value;
    const api_call = await fetch(`https://test.com/api/events? 
    locationIds=${city},${state}amp;client=${API_KEY}`);
    const data = await api_call.json();
    console.log(data);
    //set the values of the state
    this.setState({
      items: data
    });
  }

  render() {
    const itemList = this.state.items.map(
      (item, index) => 
      <li 
        key={index}>
        {item}
      </li>
    )
    return (
      <div>
        <p>Hello!</p>
        <h1>hi</h1>
        <Form getWeather={this.getWeather}/>
      <ul>
        {itemList}
      </ul>
      </div>
    )
  }
}

export default App;

{data: Array(132), success: true}
data: Array(132)
[099]
0: {id: 110503, link: ""…}
1: {id: 106100, link: ""..}
2: {id: 109675, link: ""..}
  

Комментарии:

1. перед этим.state.items.map попробуйте зарегистрировать this.state.items , проверьте его массив

2. когда я попробовал console.log(this.state.items), он возвращает мне данные объекта. Однако я не вижу никакого текста (тег li) с моей точки зрения. В чем может быть ошибка?

3. Должно ли это быть похоже на {item.link}, чтобы я мог получить список всех ссылок?

4. Если это объект, у него нет функции .map , вы должны найти правильные данные, которые являются массивом. можете ли вы вставить данные this.state.items в свой вопрос?

5. Он находится в приложении экспорта по умолчанию; Объект выглядит так после записи console.log(this.state.items)

Ответ №1:

Попробуйте сначала проверить состояние.элементы, подобные таким:

 if(this.state.items){
  const itemList = this.state.items.map((item, index) => (
    <li key={index}> {item} </li>
  )
}
  

Комментарии:

1. Я добавил код для проверки, существует ли this.state.tiems, и он возвращает мне данные объекта, как я написал в последнем из моего кода. Однако я не вижу никакого текста из представления. Как вы думаете, в чем проблема?

2. данные.data полностью сработали. но проблема в том, что я проверял неправильные данные

Ответ №2:

getWeather api является асинхронным, что означает, что функция рендеринга вызывается до загрузки данных, следовательно, вам нужна проверка перед запуском функции map

 const itemList = (this.state.items amp;amp; this.state.items.length > 0) ?
this.state.items.map(
    (item, index) =>
    <
    li key = {
        index
    } > {
        item
    } <
    /li>
) : ''
  

Комментарии:

1.Я добавил код для проверки, существует ли this.state.tiems, и он возвращает мне данные объекта, как я написал в последнем из моего кода. Однако я не вижу никакого текста из представления. Как вы думаете, в чем проблема?

2. попробуйте это this.setState({ items: data.data });

3.данные.data полностью сработали. но проблема в том, что я проверял неправильные данные