Использование состояния с componentDidMount

#reactjs #state #react-lifecycle

#reactjs #состояние #реагировать-жизненный цикл

Вопрос:

Я хочу получить данные, которые успешно возвращаются после componentDidMount, но до того, как появится сообщение об ошибке.данные не определены:

 // imports
export default class LookSinger extends Component {
    state = {
        singer: {}
    }
    componentDidMount () {
        let { singer } = this.props.location.state;
        singer = singer.replace(/ /g," ");
        const fetchData = async () => {
        try {
            const response = await fetch(
                `http://ws.audioscrobbler.com/2.0/?method=artist.getinfoamp;artist=${singer}amp;api_key=a3c9fd095f275f4139c33345e78741edamp;format=json`
            );
            const data = await response.json();
            this.setState({
                singer: data
            })
          } catch (error) {
            console.log(error.message);
          }
        }
        fetchData();
    }
      render() {
          let singer = this.state.singer
        return(
            <div>
                {console.log(singer.artist.name)} // gives undefined but after fetching artist.name absolutely exists
            </div>
        )
      }
}
 

Url is:http://ws.audioscrobbler.com/2.0/?method=artist.getinfoamp;artist=Ariana Grandeamp;api_key=a3c9fd095f275f4139c33345e78741edamp;format=json

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

1. singer это объект, разве он не должен быть строкой?

Ответ №1:

Проблема здесь:

{console.log(singer.artist.name )}

При первоначальном рендеринге singer.artist значение не определено, и если вы его вызовете singer.artist.name , оно выдаст ошибку. name of undefined …. Вам просто нужно дождаться получения данных и обновить состояние.

Попробуйте так

 export default class LookSinger extends Component {
  state = {
    singer: {}
  }
  componentDidMount () {
    let { singer } = this.props.location.state;
    singer = singer.replace(/ /g," ");
    const fetchData = async () => {
    try {
        const response = await fetch(`http://ws.audioscrobbler.com/2.0/?method=artist.getinfoamp;artist=${singer}amp;api_key=a3c9fd095f275f4139c33345e78741edamp;format=json`);
        const data = await response.json();
        this.setState({ singer: data })
      } catch (error) {
        console.log(error.message);
      }
    }
    fetchData();
  }
  render() {
    const { singer } = this.state
    if (!singer.artist) { // <-- Check if the data is present or not.
      return <div>Loding singer info...</div>
    }
    return(
      <div>
        <h1>{singer.artist.name}</h1>
      </div>
    )
  }
}
 

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

1. Спасибо, брат

2. Нет проблем, рад помочь!

Ответ №2:

У вас let singer = this.state this.setState({ singer: ... }) есть, но в вашем коде этого нет. Вместо this.setState({ data }) этого попробуйте this.setState({ singer: data })

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

1. можете ли вы прислать мне URL-адрес вашего запроса, чтобы я мог увидеть результат JSON?

Ответ №3:

Установите ваше состояние, как показано ниже, и,

         const data = await response.json();
        this.setState({
            singer: data
        })
 

и вы можете выйти из системы следующим образом,

         console.log(this.state.singer)
 

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

1. В чем ваша проблема сейчас?

2. Проблема та же самая

3. Твоя проблема в том, что «певец. данные не определены:», но вы не звоните как певец. данные находятся в любом месте вашего кода.