Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Erro na função map para comentarios e likes

Onde foi que eu errei? Ao incluir os dados dinâmicos de likers e comentários, recebi o erro "TypeError: Cannot read property 'map' of undefined" conforme dados abaixo:

class FotoInfo extends Component {
    render(){
        return (
            <div className="foto-in fo">
              <div className="foto-info-likes">
                {
                  this.props.foto.likers.map(liker => {
                    return (<a href="#">{liker.login},</a>)
                  })
                }
                 curtiram

              </div>
              <p className="foto-info-legenda">
                <a className="foto-info-autor">autor </a>
                {this.props.foto.comentario}
              </p>

              <ul className="foto-info-comentarios">
                {
                  this.props.foto.comentarios.map(comentario => {
                    return (
                      <li className="comentario">
                        <a className="foto-info-autor">{comentario.login} </a>
                        {comentario.texto}
                      </li>
                    );
                  })
                }
              </ul>
            </div>            
        );
    }
}
TypeError: Cannot read property 'map' of undefined
FotoInfo.render
C:/Users/Pantufa/cursos/react2/instalura/src/componentes/FotoItem.js:22
  19 | render(){
  20 |     return (
  21 |         <div className="foto-in fo">
> 22 |           <div className="foto-info-likes">
     | ^  23 |             {
  24 |               this.props.foto.likers.map(liker => {
  25 |                 return (<a href="#">{liker.login},</a>)
View compiled
(anonymous function)
C:/Users/Pantufa/cursos/react2/instalura/src/componentes/Timeline.js:15
  12 |      fetch("https://instalura-api.herokuapp.com//api/public/fotos/vitor")
  13 |        .then(response => response.json())
  14 |        .then(fotos =>{
> 15 |          this.setState({fotos:fotos});
     | ^  16 |        });
  17 |    }
  18 | 
View compiled
This screen is visible only in development. It will not appear if the app crashes in production.
Open your browser’s developer console to further inspect this error.

no console:

index.js:1375 The above error occurred in the <FotoInfo> component:
    in FotoInfo (at FotoItem.js:79)
    in div (at FotoItem.js:76)
    in FotoItem (at Timeline.js:23)
    in div (at Timeline.js:21)
    in Timeline (at App.js:11)
    in div (at App.js:9)
    in div (at App.js:8)
    in App (at src/index.js:8)
Consider adding an error boundary to your tree to customize error handling behavior. Visit https://fb.me/react-error-boundaries to learn more about error boundaries. console.<computed> @ index.js:1375
FotoItem.js:22 Uncaught (in promise) TypeError: Cannot read property 'map' of undefined
    at FotoInfo.render (FotoItem.js:22)
    at finishClassComponent (react-dom.development.js:15319)
    at updateClassComponent (react-dom.development.js:15274)
    at beginWork (react-dom.development.js:16262)
    at performUnitOfWork (react-dom.development.js:20279)
    at workLoop (react-dom.development.js:20320)
    at renderRoot (react-dom.development.js:20400)
    at performWorkOnRoot (react-dom.development.js:21357)
    at performWork (react-dom.development.js:21267)
    at performSyncWork (react-dom.development.js:21241)
    at requestWork (react-dom.development.js:21096)
    at schedule
4 respostas

Boa noite, Clarisse! Como vai?

Vamos partir da mensagem de erro:

TypeError: Cannot read property 'map' of undefined

Isso significa que vc está tentando invocar o método map() a partir de alguém que está indefinido! E quem está indefinido é justamente o this.props.foto.likers.

Portanto, para descobrir o que está ocorrendo eu terei que dar uma olhada numa parte maior do código! Onde vc utiliza esse componente FotoInfo? Poderia colar aqui esse trecho de código?

Olá, eu estou usando o componente no arquivo FotoItem.js que completo é como segue:

import React, { Component } from 'react';

class FotoAtualizacoes extends Component {
    render(){
        return (
            <section className="fotoAtualizacoes">
              <a href="#" className="fotoAtualizacoes-like">Likar</a>
              <form className="fotoAtualizacoes-form">
                <input type="text" placeholder="Adicione um comentário..." className="fotoAtualizacoes-form-campo"/>
                <input type="submit" value="Comentar!" className="fotoAtualizacoes-form-submit"/>
              </form>

            </section>            
        );
    }
}

class FotoInfo extends Component {
    render(){
        return (
            <div className="foto-in fo">
              <div className="foto-info-likes">
                {
                  this.props.foto.likers.map(liker => {
                    return (<a href="#">{liker.login},</a>)
                  })
                }
                 curtiram

              </div>
              <p className="foto-info-legenda">
                <a className="foto-info-autor">autor </a>
                {this.props.foto.comentario}
              </p>

              <ul className="foto-info-comentarios">
                {
                  this.props.foto.comentarios.map(comentario => {
                    return (
                      <li className="comentario">
                        <a className="foto-info-autor">{comentario.login} </a>
                        {comentario.texto}
                      </li>
                    );
                  })
                }
              </ul>
            </div>            
        );
    }
}

class FotoHeader extends Component {
    render(){
        return (
            <header className="foto-header">
              <figure className="foto-usuario">
                <img src={this.props.foto.urlPerfil} alt="foto do usuario"/>
                <figcaption className="foto-usuario">
                  <a href="#">
                    {this.props.foto.loginUsuario}
                  </a>  
                </figcaption>
              </figure>
              <time className="foto-data">{this.props.foto.horario}</time>
            </header>            
        );
    }
}

export default class FotoItem extends Component {
    render(){
        return (
          <div className="foto">
            <FotoHeader foto={this.props.foto}/>
            <img alt="foto" className="foto-src" src={this.props.foto.urlFoto}/>
            <FotoInfo foto={this.props.foto}/>
            <FotoAtualizacoes/>
          </div>            
        );
    }
}

que por sua vez é renderizado na timeline:

import React, { Component } from 'react';
import FotoItem from './FotoItem';

export default class Timeline extends Component {

  constructor(){
    super();
    this.state = {fotos : []};
  }

    componentDidMount(){
      fetch("https://instalura-api.herokuapp.com//api/public/fotos/vitor")
        .then(response => response.json())
        .then(fotos =>{
          this.setState({fotos:fotos});
        });
    }

    render(){
        return (
        <div className="fotos container">
            {
              this.state.fotos.map(foto => <FotoItem foto/>)
            }

        </div>            
        );
    }
}

tenho a impressão de que o erro está na Promise, mas não consegui localizá-lo

solução!

Relendo a explicação da aula, acabei encontrando meu erro:

 this.state.fotos.map(foto => <FotoItem foto={foto}/>)

Eu tinha esquecido de terminar a declaração da tag FotoItem

Muito bem, Clarisse! Que bom que conseguiu resolver o problema! Só uma dica: veja que seguir as pistas dadas pelo erro foi algo muito importante. Eu fui pedindo pra vc mostrar os arquivos seguindo a ordem lógica de passagem da informação da foto através dos componentes. Essa é uma prática que ajuda muito para encontrar a fonte dos problemas durante o desenvolvimento!

Sempre que precisar de qualquer ajuda é só mandar aqui no fórum da Alura!

Grande abraço e bons estudos, minha aluna!