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

Error: Cannot read property 'map' of undefined

Boa noite! Não estou encontrando meu erro, já revisei onde categoria/categorias é colocado; podem me ajudar?

<select className="form-cadastro_input">
          <option>Sem Categoria</option>
          {this.props.categorias.map((categoria) => {
            return <option>{categoria}</option>;
          })}
        </select>
5 respostas

Oi Daniel!

Pelo erro, this.props.categorias está como undefined então algo de errado deve estar acontecendo na hora de passar categorias como uma prop do componente. Você poderia postar aqui o código do componente inteiro? Assim consigo fazer uma avaliação melhor.

Aguardo seu retorno.

import React, { Component } from "react";
import "./estilo.css";

class FormularioCadastro extends Component {
  constructor(props) {
    super(props);
    this.titulo = "";
    this.texto = "";
    this.categoria = "Sem categoria";
  }

  _handleMudancaTitulo(evento) {
    evento.stopPropagation();
    this.titulo = evento.target.value;
  }

  _handleMudancaTexto(evento) {
    evento.stopPropagation();
    this.texto = evento.target.value;
  }

  _criarNota(evento) {
    evento.preventDefault();
    evento.stopPropagation();
    this.props.criarNota(this.titulo, this.texto, this.categoria);
  }

  render() {
    return (
      <form className="form-cadastro" onSubmit={this._criarNota.bind(this)}>
        <select className="form-cadastro_input">
          <option>Sem Categoria</option>
          {this.props.categorias.map((categoria) => {
            return <option>{categoria}</option>;
          })}
        </select>
        <input
          placeholder="Título"
          type="text"
          className="form-cadastro_input"
          onChange={this._handleMudancaTitulo.bind(this)}
        />
        <textarea
          rows={15}
          className="form-cadastro_input"
          placeholder="Escreva sua nota..."
          onChange={this._handleMudancaTexto.bind(this)}
        />
        <button className="form-cadastro_input form-cadastro_submit">
          Criar Nota!
        </button>
      </form>
    );
  }
}

export default FormularioCadastro;

Salve daniel, beleza?

O .map() é uma função que percorre um Array[], até ai tudo quase certo.

{this.props.categorias.map((categoria) => {
            return <option>{categoria}</option>;
          })}

No seu código, 'categorias' não existe e não possui a propriedade 'map' como informa o erro (Error: Cannot read property 'map' of undefined)

Existe apenas uma categoria e ela é uma string (conforme declarado no constructor).

    this.categoria = "Sem categoria";

Para resolver o problema é preciso criar/alterar a prop categorias e informar que ela é um array para você percorrer com a função .map()

this.categorias = ['sem categoria', 'categoria1',  'categoria2' ];
solução!

Salve Nicolas!

Primeiramente, muito obrigado por participar do fórum.

Sua explicação sobre o map percorrer um array está certa, mas mudar o this.categoria para um array não é a solução adequada neste caso.

O componente FormularioCadastro tem a apenas o papel de criar uma nova nota com um título, texto e categoria. A responsabilidade de informar quais categorias existem é do componente pai. Sendo assim, as categorias devem ser passadas como props para o FormularioCadastro da seguinte maneira:

// componente pai

// declarando o array de categorias
const categoriasDoPai = ["react", "javascript", "html"];

// passando para o componente filho
<FormularioCadastro categorias={categoriasDoPai } />

Desta forma, o array categoriasDoPai estará acessível pelo FormularioCadastro através do this.props.categorias.

Espero ter ajudado!

Muito obrigado! Realmente era a falta na classe FormularioCadastro:

 <FormularioCadastro
          categorias={this.state.categorias}
          criarNota={this.criarNota.bind(this)}
        />

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software