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

TypeError: this.props.escutadorDeSubmit is not a function

Boa noite,

Estou com esse erro e não sei o motivo. Creio que meu código está igual o do instrutor.

Erro: TypeError: this.props.escutadorDeSubmit is not a function Formulario.submitFormulario C:/Users/daniel.carneiro/Desktop/react-parte1/projeto/curso-react-alur/src/Formulario.js:26 23 | } 24 | 25 | submitFormulario = () =>{

26 | this.props.escutadorDeSubmit(this.state); | ^ 27 | this.setState(this.stateInicial); 28 | } 29 |

Formulario.js

import React, { Component } from 'react';

class Formulario extends Component {

    constructor(props) {
        super(props);

        this.stateInicial = {
            nome: "",
            livro: "",
            preco: "",
        }

        this.state = this.stateInicial;
    }

    escutadorDeInput = event => {
        const { name, value } = event.target;

        this.setState({
            [name] : value
        });
    }

    submitFormulario = () =>{
        this.props.escutadorDeSubmit(this.state);
        this.setState(this.stateInicial);
    }

    render() {

        const { nome, livro, preco } = this.state;  

        return (
            <form>

                <label htmlFor="nome">Nome</label>
                <input
                    id="nome"
                    type="text"
                    name="nome"
                    value={nome}
                    onChange={this.escutadorDeInput}
                />

                <label htmlFor="livro">Livro</label>
                <input
                    id="livro"
                    type="text"
                    name="livro"
                    value={livro}
                    onChange={this.escutadorDeInput}
                />


                <label htmlFor="preco">Preço</label>
                <input
                    id="preco"
                    type="text"
                    name="preco"
                    value={preco}
                    onChange={this.escutadorDeInput}
                />

                <button onClick={this.submitFormulario} type="button">Salvar
    </button>
            </form>
        )
    }
}

export default Formulario;

App.js

import React, { Component, Fragment } from 'react';
import './App.css';
import Tabela from './Tabela'
import Form from './Formulario'

class App extends Component {

  state = {
    autores: [{
      nome: 'Paulo',
      livro: 'React',
      preco: '1000'
    },
    {
      nome: 'Daniel',
      livro: 'Java',
      preco: '99'
    },
    {
      nome: 'Marcos',
      livro: 'Design',
      preco: '150'
    },
    {
      nome: 'Bruno',
      livro: 'DevOps',
      preco: '100'
    },
    {
      nome: 'Nico',
      livro: 'Java',
      preco: '999'
    },
    ],
  };


  removeAutor = (index) => {
    const { autores } = this.state;

    this.setState(
      {
        autores: autores.filter((autor, posAtual) => {
          return posAtual !== index;
        }),
      }
    );
  }

  escutadorDeSubmit = autor => {
    this.setState({ autores: [...this.state.autores, autor] })
  }

  render() {

    return (
      <Fragment>
        <Tabela autores={this.state.autores} removeAutor={this.removeAutor} />
        <Form escutadorDeSubmit = {this.escutadorDeSubmit}/>
      </Fragment>
    );
  }
}


export default App;

Agradeço a ajuda!

5 respostas

Fala ai Daniel, o problema está na função submitFormulario da classe Formulario, vamos ver o código dela:

submitFormulario = () =>{
    this.props.escutadorDeSubmit(this.state);
    this.setState(this.stateInicial);
}

Repare que ela está procurando uma função escutadorDeSubmit dentro de suas propriedades, mas, no caso a função está na própria classe, então devemos remover o .props ficando:

submitFormulario = () =>{
    this.escutadorDeSubmit(this.state);
    this.setState(this.stateInicial);
}

Agora ela vai referenciar a função da própria classe.

Espero ter ajudado.

solução!

Opa, obrigado pela resposta!

Então, estranhamente eu testei hoje e funcionou, não deu o erro. Não fiz nenhuma mudança e o erro parou de acontecer, só não entendi o porquê o erro estava acontecendo ontem e hoje parou.

Porém quando faço a mudança que você comentou, aí sim tenho um erro.

TypeError: this.escutadorDeSubmit is not a function
Formulario.submitFormulario
C:/Users/daniel.carneiro/Desktop/react-parte1/projeto/curso-react-alur/src/Formulario.js:26
  23 |    }
  24 | 
  25 |    submitFormulario = () =>{
> 26 |        this.escutadorDeSubmit(this.state);
     | ^  27 |        this.setState(this.stateInicial);
  28 |    }
  29 | 

Porém o que você disse fez sentido, mas não funcionou. Teria uma explicação do porquê não funcionou?

Mas obrigado pela ajuda!

Abraço!

Fala ai Daniel, acho que foi falha minha, eu confundi a função escutadorDeInput com escutadorDeSubmit, acho que ja era tarde e muitas duvidas kkk, desculpa o transtorno, vou prestar mais atenção nas próximas.

Sobre o seu problema o certo é this.props.escutadorDeSubmit(this.state);

Talvez no primeiro momento que você testou, ainda não tinha declarado a props no componente, ou seja:

<Form escutadorDeSubmit = {this.escutadorDeSubmit}/>

O Form ainda não estava recebendo a propriedade escutadorDeSubmit, uma vez que você informou ela, o problema deve ter resolvido.

Ou pode ser algum cache que ao recarregar ou reiniciar o servidor local foi resolvido.

Espero ter ajudado.

Entendi! Valeu pela força, Matheus!

Abraço!

Magina Daniel, sempre que precisar não deixe de criar suas dúvidas.

Abraços e bons estudos.