Não estou conseguindo entender algumas questões:
1) O método valido() retorna o seguinte objeto estruturado, partindo do princípio que todo o objeto é válido. Esta é a estrutura do objeto retornado pelo método:
{
isValid: true,
nome: { isInvalid: false, message: '' },
livro: { isInvalid: false, message: '' },
preco: { isInvalid: false, message: ''}
}
2) No código:
if (!validacao[regra.campo].isInvalid){
Aqui ele faz um forEach em cada objeto do array validacoes, checando se o campo não foi marcado como inválido, certo? Mas, como assim? Se eu passo a variável validacao recebendo o objeto supostamente válido (let validacao = this.valido(); ) Não é reduntante fazer esse if?
3) Na declaração das variáveis (const):
const campoValor = state[regra.campo.toString()]; //
const args = regra.args || [];
const metodoValidacao = typeof regra.metodo === 'string' ? validador[regra.metodo] : regra.metodo;
- O campoValor é responsável pelo que?
- O args irá correr por cada objeto do array, verificando se existe algum args, se sim ele retorna regra.args (caso do preco), se não, ele retorna nada (caso do nome e livro)
- Não entendi esse metodoValidacao... Ele faz a comparação do metodo se é 'string'? Mas que metodo? Se sim, ele retorna o validador[regra.metodo], que seria quem? Se não, retorna regra.metodo. Qual a diferença? (Estou bem perdido aqui..)
4) Não entendi a sintaxe, pois não entendi a variável, metodoValidacao. Essa variável está recebendo os argumentos: "campoValor, ...args, state"? A comparação com o campo validaQuando, eu consigo entender, mas o metodoValidacao, não estou conseguindo.
if(metodoValidacao(campoValor, ...args, state) !== regra.validaQuando){
5) No submitForm:
submitForm = () => {
const validacao = this.validador.valida(this.state);
if (validacao.isValid) {
this.props.listenerSubmit(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);
}
}
A) Aqui ele fica checando o status e atualizando para verificar se cada campo do formulário está compatível com as regras passadas para cada caso. Quando clicado o botão de submit e estiver tudo válido ele terá um listenerSubmit e implementará em nossa tabela os dados válido, com setState. Certo? B) Mas, quando algum campo for inválido. Não entendi o porquê declarar o primeiro const {nome, livro, preco}
Código do instrutor:
valida(state) {
//itera pelo array de regras de validação e constrói
//um objeto validacao e retorna-o
//começa assumindo que está tudo válido, recebe o
//objeto do método valido.
let validacao = this.valido();
this.validacoes.forEach(regra => {
//Se o campo não tiver sido marcado
//anteriormente como invalido por uma regra.
if (!validacao[regra.campo].isInvalid) {
//Determina o valor do campo, o método a ser invocado
//e os argumentos opcionais pela definição da regra
const campoValor = state[regra.campo.toString()];
const args = regra.args || [];
//if ternário para estar preparado caso
//alguém passe o método direto sem ser string
const metodoValidacao = typeof regra.metodo === 'string' ?
validador[regra.metodo] : regra.metodo;
//invoca o método específico da regra
if (metodoValidacao(campoValor, ...args, state) !== regra.validoQuando) {
//modifica o objeto no campo específico
validacao[regra.campo] = {
isInvalid: true,
message: regra.mensagem
};
validacao.isValid = false;
}
}
});
return validacao;
}