Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
13
respostas

Erro ao usar o Toast do materialize-cc

Prezados,

estou tendo problema similar relatado pelo Caio em https://cursos.alura.com.br/forum/topico-erro-ao-utilizar-o-toast-do-materialize-css-114714. Ou seja, ao tentar utilizar o "Toast" do materialize os seguintes erros aparecem no momento da submeter o form e exibir as mensagens:


TypeError: Cannot read property 'jquery' of undefined
Toast._createToast
node_modules/materialize-css/dist/js/materialize.js:5173
  5170 |   toast.appendChild(this.message);
  5171 | 
  5172 |   // Check if it is jQuery object
> 5173 | } else if (!!this.message.jquery) {
       | ^  5174 |   $(toast).append(this.message[0]);
  5175 | 
  5176 |   // Insert as html;

exibeMensagem
src/PopUp.js:9
   6 |     if(status === 'success')
   7 |         M.toast({ html: msg, classes: 'green', displayLength: 2000 });
   8 |     
>  9 |     if(status === 'error') 
     | ^  10 |         M.toast({ html: msg, classes: 'red', displayLength: 2000 });
  11 | 
  12 | }
View compiled

(anonymous function)
src/Formulario.js:106
  103 |     });
  104 |     
  105 |     camposInvalidos.forEach(campo => {
> 106 |             PopUp.exibeMensagem('error', campo.mensagem);
      | ^  107 |     });                        
  108 | }
  109 | 
View compiled

Formulario.submitFormulario
src/Formulario.js:105
  102 |         return elem.isInvalid;
  103 |     });
  104 |     
> 105 |     camposInvalidos.forEach(campo => {
      | ^  106 |             PopUp.exibeMensagem('error', campo.mensagem);
  107 |     });                        
  108 | }
View compiled

Refiz os códigos conforme o exercício duas vezes, mas não consegui resolver como o Caio. Já não tenho mais idéia do que está impedindo de funcionar.

Abaixo segue o meu PopUp.js


import M from 'materialize-css';

const PopUp = {
    exibeMensagem: (status, msg) => {

        if(status === 'success')
            M.toast({ html: msg, classes: 'green', displayLength: 2000 });

        if(status === 'error') 
            M.toast({ html: msg, classes: 'red', displayLength: 2000 });

    }
}
export default PopUp;

No próximo post anexarei o código do meu Formulario.js ...

13 respostas

Código do meu Formulario.js ...

import React, { Component } from 'react';
import FormValidator from './FormValidator.js';
import PopUp from './PopUp.js';

import styled from 'styled-components';

const Container = styled.div`
  text-align: center;
`;

class Formulario extends Component {

    /* Criaremos também um constructor(), afinal, como temos um formulário no qual 
       dados serão inseridos, iremos alterar o estado de um elemento. Nesse 
       construtor, receberemos os props e os passaremos para o Component com o 
       super(). Criaremos então um stateInicial, um objeto com o estado inicial do 
       nosso formulário, no qual todos os campos estarão vazios. Por fim, setaremos 
       o state com esse stateInicial. */
    constructor(props) {
        super(props);

        this.validador = new FormValidator([
            {
                campo: 'nome',
                metodo: 'isEmpty',
                validoQuando: false, // Qdo o método isEmpty é válido ? Qdo for false.
                mensagem: 'Entre com um nome'
            },
            {
                campo: 'livro',
                metodo: 'isEmpty',
                validoQuando: false,
                mensagem: 'Entre com um livro'
            },
            {
                campo: 'preco',
                metodo: 'isInt',
                args: [{ min: 0, max: 99999 }],
                validoQuando: true, // Qdo o método isInt é válido ? Qdo for true.
                mensagem: 'Entre com um valor numérico'
            }
        ]);

        this.stateInicial = {
            nome: '',
            livro: '',
            preco: '',
            validacao: this.validador.valido()
        }

        this.state = this.stateInicial;
    }

    // Método para escutar eventos de input
    escutadorDeInput = event => {
        const { name, value } = event.target;

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

    // Método para submeter novo autor ao formulário
    submitFormulario = () => {

        const validacao = this.validador.valida(this.state);

        if (validacao.isValid) {
            this.props.escutadorSubmit(this.state);
            this.setState(this.stateInicial);
        } else {
            const {nome, livro, preco} = validacao;
            const campos = [nome, livro, preco];

            const camposInvalidos = campos.filter(elem => {
                return elem.isInvalid;
            });

            camposInvalidos.forEach(campo => {
                    PopUp.exibeMensagem('error', campo.mensagem);
            });                        
        }

    }

    render() {

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

        return (
            /* Repare que no formulário temos a palavra 'for', que é uma palavra 
               reservada do JavaScript, e que não poderemos utilizar no JSX. 
               Sendo assim, vamos alterá-la para o equivalente 'htmlFor'. */
            <form>

                <div className="row">
                    <div className="input-field col s4">
                        <label className="input-field" htmlFor="nome">Nome</label>
                        <input
                            className="validate"
                            id="nome"
                            type="text"
                            name="nome"
                            value={nome}
                            onChange={this.escutadorDeInput}
                        />
                    </div>

                    <div className="input-field col s4">
                        <label className="input-field" htmlFor="livro">Livro</label>
                        <input
                            className="validate"
                            id="livro"
                            type="text"
                            name="livro"
                            value={livro}
                            onChange={this.escutadorDeInput}
                        />
                    </div>

                    <div className="input-field col s4">
                        <label className="input-field" htmlFor="preco">Preço</label>
                        <input
                            className="validate"
                            id="preco"
                            type="text"
                            name="preco"
                            value={preco}
                            onChange={this.escutadorDeInput}
                        />
                    </div>
                </div>

                <Container>
                    <button className="waves-effect waves-light blue lighten-2 btn"
                        onClick={this.submitFormulario} type="button">Salvar</button>
                </Container>

            </form >

        )

    }

}

export default Formulario;

Fala ai Alexandre, tudo bem? Parece que o toast precisa do jQuery para funcionar, já tentou realizar a instalação e importação do mesmo? Talvez resolva o problema.

Espero ter ajudado.

Tudo bem Matheus !

Não tentei ... Como faço para instalar e importar o jQuery !?

Tentou reinstalar o materialize com a mesma versão da aula? Fez a alteração que tem na errata logo depois? Alguém teve esse mesmo problema e, neste caso, era o que estava na errata.

https://cursos.alura.com.br/forum/topico-erro-na-exibicao-do-popup-cannot-read-property-jquery-of-undefined-89996

 Olá Matheus, 

 eu realizei a instalação do JQuery. Contudo, não sei se fiz a importação correta do mesmo no arquivo PopUp.js ... Eu coloquei assim: import 'jquery';

Após instalação e importação o problema continua. 
Boa tarde Alexander !

Reinstalei a versão 1.0.0 do materialize-css, a errata já tinha alterado para a forma correta. Mesmo tomando essas ações o erro continua.

Não sei mais o que fazer ! Os erros que os demais colegas tiveram aqui no fórum a respeito eu já tentei e não deu certo.

Se puder Alexandre, envia seu projeto aqui, para que eu possa baixá-lo e executá-lo aqui na minha máquina e ver se ocorrem os mesmos erros.

Alexander,

posso sim. Como o pessoal aqui nos fóruns da Alura fazem para anexar arquivos ? Caso não dê, eu posso lhe enviar por email ...

Pode ser um link de git, ou, pode mandar para alexander@aldesenvolvimento.com.br.

Alexander, enviei o link para o e-mail indicado ...

solução!

Recebi Alexandre, e o sistema rodou de boa aqui. Só abriu com um erro no arquivo ApiService, na linha 27, pois o body da requisição recebia a variável autor e deveria receber o id. Fiz o ajuste e o sistema abriu normalmente. Enviei um print para seu e-mail. Ou seja, aparentemente o erro pode estar na sua máquina e não no projeto. Procure reinstalar o Node, o NPM, quem sabe até iniciar um novo projeto e depois copiar os arquivos do seu atual.

Uma forma de você ter certeza que é alguma configuração na sua máquina, é baixar o próprio projeto que é disponibilizado no início de cada módulo, se eles apresentarem o mesmo problema, é a configuração do seu ambiente.

Seguem as configurações do meu ambiente para informação.

S.O: Linux Mint 19.3 NodeJs: 12.18.3 NPM: 6.14.5

Os plugins/extensões utilizadas no curso foram baixadas com as versões solicitadas no curso.

    Boa noite Alexander,

    isso mesmo tinha esse erro na ApiService, esqueci de corrigir aqui e mandei assim mesmo para ti ...

    Baixei o próprio projeto que é disponibilizado no início de cada módulo do curso, como havia sugerido, e após testar no meu ambiente (S.O.: Linux Mint 19.3 Cinnamon; NodeJS v. 13.5.0 e NPM: 6.14.7) continuou o problema. Como havias previsto, problema na configuração do meu ambiente.

    Então,  criei um novo projeto com o NodeJS: 14.5.0  (que veio com o NPM: 6.14.5) . Dentro da pasta do novo projeto eu renomeie a pasta /src e em seguida peguei a pasta /src do projeto antigo, que estava dando erro, e transferi para o novo projeto. Quando tentei iniciar o projeto houve alguns erros por não haver algumas bibliotecas instaladas. Instalei elas e na próxima tentativa de iniciação, funcionou ! 

    Agradeço pela ajuda Alexander !

Que maravilha Alexandre, pelo jeito era a versão do NodeJs mesmo.