- Refatore o código
Login.js
- Unifique os estados usando um objeto chamado
form
. Faça ajustes necessários nos inputs. - Faça a validação dos inputs e os tornem obrigatórios.
- Unifique os estados usando um objeto chamado
-
Objetivo: Ter um único estado e uma única função que controla as mudanças!
-
Em
Login.js
:
-
Crio um estado que recebe um objeto, cada chave desse objeto irá referenciar valores dos inputs que eu desejo. Como os inputs que eu desejo controlar são
email
epassword
, o useState recebe um objeto comemail
epassword
:const [form, setForm] = useState({ email: '', password: '' });
-
Na propriedade
name
de cada input, eu passo a propriedade criada no useState:- input de email:
<Input name="email" (...) />
- input de password:
<Input name="password" (...) />
- input de email:
-
Altero os
values
dos inputs para receber os valores dos estados:-
input de email:
(...) <Input value={form.email} (...) />
-
input de password:
(...) <Input value={form.password} (...) />
-
-
Agora iremos tornar os campos obrigatórios com
required
e colocar uma validação de e-mail e senha comtype
:-
input email:
type="email" required
-
input senha:
type="password" required
-
Para uma validação mais forte, podemos utilizar um
Regex
na propriedadepattern
-
- Unifique as funções de
onChange
para que editem o estadoform
apenas com uma única função chamadaonChangeInputs
. Faça os ajustes necessários nos inputs.
- Ainda em
Login.js
:
-
Crio uma função chamada
onChangeInputs
, descontruindo as propriedades dos inputs e setando os forms com seus valores:const onChangeInputs = (event) => { const { name, value } = event.target; setForm({ ...form, [name]: value }); };
-
Agora substitu os
onChanges
por umonChangeInputs
:-
input de email:
(...) <Input onChange={onChangeInputs} (...) />
-
input de password:
(...) <Input onChange={onChangeInputs} (...) />
-
-
Agora mudo também o console da função
enviaLogin
:Disso
console.log({ email, password })
para issoconsole.log(form.email, form.password )
- Crie na pasta
hooks
um arquivouseForm.js
- Extraia os estados e a lógica do
onchangeInputs
e crie um custom hookuseForm
dentro do arquivouseForm.js
- Consuma o
useForm
noLogin.js
, substituindo a lógica doonChangeInputs
. Faça os ajustes necessários nos inputs
- Em
hooks
-
Criei um arquivo
useForm.js
e dentro desse arquivo coloquei uma função chamadauseForm
. Dentro dela inseri a lógica criada anteriormente, com algumas alterações para que seja mais genérica:import { useState } from 'react'; const useForm = (inicialState) => { const [form, setForm] = useState(inicialState); const onChangeInputs = (event) => { const { name, value } = event.target; setForm({ ...form, [name]: value }); }; const cleanFilds = () => { setForm(inicialState); }; return { form, onChangeInputs, cleanFilds }; }; export default useForm;
-
Em
Login.js
e faço as adaptações:const { form, onChangeInputs, cleanFilds } = useForm({ email: '', password: '', }); const enviaLogin = (e) => { e.preventDefault(); // console.log(form.email, form.password); // console.log(form); cleanFilds(); };
Refatore o Signup.js
-
Adicione a propriedade name de cada input, de acordo com o que está no formulário.
-
Trate os inputs deste componente com
type
epattern
quando necessário e torne-os obrigatórios. -
Consuma o hook
useForm
para controlar os inputs. -
Complete a função
enviarCadastro
fazendo com que o formulário não seja resetado e imprima o form.
- Em
Signup.js
:
-
Criei um estado que recebe um objeto, cada chave desse objeto irá referenciar valores dos inputs que eu desejo. Como os inputs que eu desejo controlar são
nomeUsuario
,email
,senha
econfirmaSenha
, o useState recebe um objeto comnomeUsuario
,email
,senha
econfirmaSenha
:const { form, onChangeInputs, cleanFilds } = useState({ nomeUsuario: '', email: '', senha: '', confirmaSenha: '', });
-
Modifico a função
enviarCadastro
:const enviarCadastro = (e) => { e.preventDefault(); if (form.senha === form.confirmaSenha) { console.log( form.nomeUsuario, form.email, form.senha, form.confirmaSenha ); cleanFilds(); alert('Usuário cadastrado'); } else { alert('Senhas não conferem'); } };
-
Altero as propriedades necessárias dos inputs
-
input nomeUsuario:
<Input name="nomeUsuario" id="nome" value={form.nomeUsuario} onChange={onChangeInputs} placeholder="username" required />
-
input email:
<Input name="email" id="email" value={form.email} onChange={onChangeInputs} placeholder="nome@email.com" required />
-
input senha:
<Input name="senha" id="senha" value={form.senha} onChange={onChangeInputs} placeholder="Crie sua senha" required />
-
input confirmaSenha:
<Input name="confirmaSenha" id="confirma-senha" value={form.confirmaSenha} onChange={onChangeInputs} placeholder="Confirme a senha" required />
-