React js fetch API с componentDidMount()

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я учусь React.js и пытаюсь получить API с помощью fetch(), и я попытался использовать componentDidMount(), но у меня проблема, вы можете увидеть картинку в конце поста.

 import React, { Component } from 'react'


export default class App extends Component {
    
    state = {
      weather: []
    };
    
    
    fetchData() {
        fetch('prevision-meteo.ch/services/json/rochelle-17')
        .then((response) => response.json())
        .then((obj) => {
            console.log('javascript object: ', obj)
            this.setState({ weather: obj.results});
        })
        .catch((error) => {
            console.error(error)
          })
    }
    componentDidMount() {
        console.log('Le composant App est monté sur le DOM !')
        this.fetchData();
    }
    render() {
        return (
            <div>
                {this.state.weatheramp;amp; this.state.weather.map((weatherRecord) => ( 
                  <div key={weatherRecord.city_info.name}>{weatherRecord.city_info.name}</div>
                 ))}
                Hello World !
                <button /*onClick={() => this.fetchData()}*/> Click me</button>
            </div>
        )
    }
}
  

Я хочу получить имя city_info на своей странице, но это не сработало!

Это результаты в консоли, кто-нибудь может мне помочь? введите описание изображения здесь

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

1. Ошибка говорит вам, что obj.results это undefined так. Лучше всего использовать встроенный в ваш браузер отладчик, чтобы установить точку останова в this.setState() строке и посмотреть, что obj есть. По-видимому, у него нет results свойства.

2. Примечание: проблема не в этом, но этот код подвержен fetch воздействию footgun, который я описываю в этом посте в моем анемичном маленьком блоге.

3. Также рассмотрите возможность использования weather , не wheather , слова с ошибками являются простым источником неприятных ошибок

4. но когда я использую console.log(‘javascript object: ‘, obj), я могу видеть содержимое json в консоли

Ответ №1:

Установка состояния является асинхронной, поэтому React выполняет рендеринг до того, как состояние было установлено. Что вы можете сделать, так это ввести условие короткого замыкания this.state.weather amp;amp; , чтобы проверить, существует ли массив погоды, и только когда он будет доступен map , операция будет выполнена, и вы не должны получать никаких ошибок.

 import React, { Component } from 'react'


export default class App extends Component {
    
    state = {
      weather: []
    };
    
    
    fetchData() {
        fetch('http://localhost:3000/rochelle-17.json')
        .then((response) => response.json())
        .then((obj) => {
            //console.log('javascript object: ', obj)
            this.setState({ weather: obj.results});
        })
    }
    componentDidMount() {
        console.log('Le composant App est monté sur le DOM !')
        this.fetchData();
    }
    render() {
        return (
            <div>
                {this.state.weatheramp;amp; this.state.weather.map((weatherRecord) => (
                    <div key={weatherRecord.city_info.name}></div>
                ))}
                Hello World !
                <button /*onClick={() => this.fetchData()}*/> Click me</button>
            </div>
        )
    }
}
  

Некоторые примечания:

  • Более новые версии React поддерживают настройку начального состояния, подобного этому, что немного чище:

      state = {
       weather: []
     }
      
  • Также рекомендуется перехватывать ошибки в случае сбоя вызова API. Вы можете просто использовать .catch так после последнего .then() :

      .catch((error) => {
       console.error(error)
     })
      
  • Начиная с ES6, вам не нужно использовать return для <div> рендеринга. Вы можете просто использовать map с изогнутыми скобками () вместо фигурных скобок {} , чтобы неявно возвращать

      {this.state.weatheramp;amp; this.state.weather.map((weatherRecord) => ( 
       <div key={weatherRecord.city_info.name}></div>
     ))}
      

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

1. спасибо за помощь, ошибка была исправлена, но теперь проблема в том, что я не могу получить общее имя из файла json!

Ответ №2:

Попробуйте это

 export default class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      wheather: null
    };
  }

  fetchData() {
    fetch("http://localhost:3000/rochelle-17.json")
      .then((response) => {
        return response.json();
      })
      .then((obj) => {
        //console.log('javascript object: ', obj)
        this.setState({ wheather: obj });
      });
  }
  componentDidMount() {
    console.log("Le composant App est monté sur le DOM !");
    this.fetchData();
  }
 render() {
    return (
      <div>
        {this.state.wheather
          amp;amp; <div key={this.state.wheather.city_info.name}>{this.state.wheather.city_info.name}</div>
        }
        Hello World !
        <button /*onClick={() => this.fetchData()}*/> Click me !</button>
      </div>
    )
  }
}
  

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

1. Спасибо за помощь, ошибка была исправлена, но теперь проблема в том, что я не могу получить имя из файла json!

2. Тогда это другая проблема. Пожалуйста, проверьте ваш ‘obj.result’ и его структуру. Или вы можете предоставить эту информацию в формате JSON здесь .

3. это мой JSON-файл: prevision-meteo.ch/services/json/rochelle-17 как я могу получить информацию об этом??

4. Является ли это целым «obj.results»? ‘obj.results’ — это массив или объект?

5. я не знаю, но я хочу получить имя ctiy из этого файла JSON: prevision-meteo.ch/services/json/rochelle-17 использование выборки! ‘obj.results’ я получаю из видео