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

TypeError: this.validacoes.map is not a function

Bom dia pessoal,

estou com o mesmo problema relatado pelo Cristiano em https://cursos.alura.com.br/forum/topico-typeerror-this-validacoes-map-is-not-a-function-111680.

Apesar dele ter solucionado o problema comentando apenas as chamadas do componente PopUp presentes no Formulario.js eu continuo com o problema mesmo não usando este componente. Verifiquei o meu código com o apresentado nas aulas até aqui e não consegui compreender o que está acontecendo.

Segue abaixo o meu FormValidator.js ...

import validador from 'validator';

class FormValidator {

    constructor(validacoes) {
        this.validacoes = validacoes;
    }

    valido() {
        const validacao = { };

        // populando o objeto de acordo com a quantidade de campos
        // criando a chave isInvalid e atribuindo false para cada
        // **TODOS OS CAMPOS COMEÇAM VÁLIDOS!**
        this.validacoes.map(regra => (
            validacao[regra.campo] = { isInvalid: false, message: '' }
        ));

        //retorna um grande objeto com uma chave externa isValid 
        //junto com todos os outros campos.
        return { isValid: true, ...validacao };
    }

    valida(state) {

        let validacao = this.valido();

        this.validacoes.forEach(regra => {
            const campoValor = state[regra.campo.toString()];
            const args = regra.args || [];
            const metodoValidacao = typeof regra.metodo === 'string' ?
            validador[regra.metodoValidacao] : regra.metodo; 

            /* Segundo parâmetro é uma lista opcional de argumentos possíveis de 
               configuração dos métodos de validação  */
            if (metodoValidacao(campoValor, ...args, state) !== regra.validoQuando) {
                validacao[regra.campo] = {
                    isInvalid: true,
                    message: regra.message
                }

                validacao.isValid = false;
            } 
        });        
        return validacao;
    }

}
export default FormValidator;
5 respostas

Oi, Alexandre, tudo bem?

Você pode compartilhar o código do seu Formulario.js? Podemos entender melhor o que está acontecendo com esse arquivo, pois testei esse código com o projeto do curso e não obtive esse erro. Aguardo :}

Segue o meu código do Formulario.js ...


import React, { Component } from 'react';
import styled, { css } from 'styled-components';

import FormValidator from './FormValidator.js';

// É dentro desses (`) acentos graves que entrará o código CSS 
// para estilizar o Container
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(console.log);

        }

    }

    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;
solução!

Oi, Alexandre, bom dia!

No arquivo Fomulario.js dentro do objeto New FormValidator faltaram os colchetes do array, devendo ficar assim:

 this.validador = new FormValidator([
      {
        campo: "nome",
        metodo: "isEmpty",
        validoQuando: 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,
        mensagem: "Entre com um valor numérico",
      }
    ]);

Assim, vai funcionar certinho. Testa e me fala se deu certo :}

 Bom dia Laís !

 Inseri os colchetes do array e funcionou certinho. Nossa, como ficamos viciados com o código ao ponto de não ver essas coisinhas, que fazem toda a diferença ;-)

 Nada como um outro olhar ...

Obrigado !

Que bom que te ajudou, Alexandre :}

Bons estudos!

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