CursosEmpresasBlogLiveConfPrecios

Crear Formulario de Login

Clase 16 de 29 • Curso de React Router 5 y Redux

Clase anteriorSiguiente clase

Contenido del curso

Bienvenida al curso

  • 1
    Todo lo que aprenderás sobre React Router y Redux

    Todo lo que aprenderás sobre React Router y Redux

    01:30 min

¿Qué es React Router? y Aplicarlo en tus proyectos

  • 2
    ¿Qué es React Router y cómo instalarlo?

    ¿Qué es React Router y cómo instalarlo?

    02:54 min
  • 3
    Crear nuestro archivo de Rutas

    Crear nuestro archivo de Rutas

    07:33 min
  • 4
    Container: Login

    Container: Login

    10:29 min
  • 5
    Container: Register

    Container: Register

    06:28 min
  • 6
    Container: 404 Not Found

    Container: 404 Not Found

    06:43 min
  • 7
    Componente: Layout

    Componente: Layout

    05:10 min
  • 8
    Manejando enlaces y configuraciones

    Manejando enlaces y configuraciones

    06:33 min

¿Qué es Redux?

  • 9
    Qué es Redux

    Qué es Redux

    02:17 min
  • 10

    ¿Qué es Redux? Profundizando en la herramienta

    01:32 min
  • 11
    Instalación de Redux

    Instalación de Redux

    04:40 min
  • 12
    Creando el Store de Redux

    Creando el Store de Redux

    12:53 min

Aplicando Redux a nuestra aplicación

  • 13
    Creando los reducers

    Creando los reducers

    10:40 min
  • 14
    Finalizando reducers y eliminar favoritos

    Finalizando reducers y eliminar favoritos

    08:26 min
  • 15
    Debuggeando nuestro proyecto (agregando validaciones a nuestro componente card)

    Debuggeando nuestro proyecto (agregando validaciones a nuestro componente card)

    04:19 min
  • 16
    Crear Formulario de Login

    Crear Formulario de Login

    Viendo ahora
  • 17
    Formulario de Login con Redux

    Formulario de Login con Redux

    06:28 min
  • 18
    Creando un Servicio para Gravatar

    Creando un Servicio para Gravatar

    05:28 min
  • 19
    Uso de gravatar en nuestro proyecto

    Uso de gravatar en nuestro proyecto

    07:16 min
  • 20
    Validación para LogIn LogOut

    Validación para LogIn LogOut

    09:15 min
  • 21
    Register

    Register

    07:00 min
  • 22
    Register con Redux

    Register con Redux

    04:17 min
  • 23
    Vista general del player

    Vista general del player

    05:26 min
  • 24
    Arreglando la funcionalidad del player

    Arreglando la funcionalidad del player

    06:55 min
  • 25
    Terminando de detallar nuestro player

    Terminando de detallar nuestro player

    13:50 min
  • 26
    Validaciones

    Validaciones

    10:35 min
  • 27
    Validaciones de UI

    Validaciones de UI

    07:04 min
  • 28
    Debug con Redux Devtools

    Debug con Redux Devtools

    05:57 min

Cierre del curso

  • 29
    Cierre del Proyecto

    Cierre del Proyecto

    00:39 min
Tomar examen

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads
        David Behar

        David Behar

        student•
        hace 6 años

        Tengan en cuenta que su botón tiene que ser de tipo submit para que funcione.

          Jesús Miguel Quinto Teran

          Jesús Miguel Quinto Teran

          student•
          hace 6 años

          En realidad no tuve que agregar el tipo submit sobre el botón, lo cual es algo curioso.

          rusbel bermúdez rivera

          rusbel bermúdez rivera

          student•
          hace 6 años

          En mi caso agregue el type=submit al botón para que hiciera lo propio.

        Seba Cardoso

        Seba Cardoso

        student•
        hace 6 años

        En esta clase de React con Richard se explica como se agregan los valores dinamicos del formulario. Minuto 4:00. Clase de React

          silvana murgo

          silvana murgo

          student•
          hace 5 años

          Gracias :D

        Salvador Galliano

        Salvador Galliano

        student•
        hace 5 años

        Otra forma de hacerlo es usando useReducer de React Hooks. Dejo mi codigo y el resultado.

        useReducer.png
        useReducer2.png

          Andrés Felipe Eslava Zuluaga

          Andrés Felipe Eslava Zuluaga

          student•
          hace 5 años

          Esta forma se ve excelente! No sabía el uso de useReduce. Investigaré sobre este hook

          William Rodriguez

          William Rodriguez

          student•
          hace 5 años

          Interesante tu implementación se ve limpia con useReducer.

        Andrés Campuzano Garzón

        Andrés Campuzano Garzón

        student•
        hace 6 años

        🦄 Acá el código de lo realizado hasta el momento: https://github.com/AndresCampuzano/React-Router-and-Redux/commit/381a70e544dd29de467e57416d1d3822f33ed632

        Marco Antonio Macedo Preciado

        Marco Antonio Macedo Preciado

        student•
        hace 6 años

        ¿Qué significan los "[]" en [event.target.name]? ¿Cuál es su función?

          Alexis Alberto Texis Auza

          Alexis Alberto Texis Auza

          student•
          hace 6 años

          Hola marco,el uso de corchetes se utiliza para poder aplicarle el valor de una variable a un key dentro de un objeto. De lo contrario estarías asignándole o en este caso buscando un atributo(key) con el nombre event.target.value.

          En este caso necesitamos el valor del atributo name del tag input correspondiente. Salida : e.target.name-> 'email' o 'password' De esta forma podremos hacer referencia a que key modificar en el estado

        Armando de jesus santiz lopez

        Armando de jesus santiz lopez

        student•
        hace 6 años

        Es buen práctica mezclar estados locales con Redux ?

          Daniel Alberto Esquinazi

          Daniel Alberto Esquinazi

          student•
          hace 6 años

          En mi opinión deberías usar Redux solamente cuando sea necesario, entonces si tenes el state de un componente que no necesita ser global como el caso del estado del formulario es mejor utilizar el manejo de estado nativo de React y no con Redux.

        Sebastián Buitrago

        Sebastián Buitrago

        student•
        hace 5 años

        Si usan prettier agreguen esta linea a su config para que él quite los parentesis cuando solo haya un parametro

        "prettier.arrowParens": "avoid",
        Orlando Manuel Mendoza Vargas

        Orlando Manuel Mendoza Vargas

        student•
        hace 5 años

        Reto completado, aquí está mi UI mejorada del Login y de Register 💚💚💚 .

        2021-04-05 (4).png
        .
        2021-04-05 (5).png

        Jonh Pertuz pertuz

        Jonh Pertuz pertuz

        student•
        hace 5 años

        En que curso enseñan el tema de login y como manejar y mantener el inicio de sesion ?

          Héctor Eduardo López Carballo

          Héctor Eduardo López Carballo

          student•
          hace 5 años

          Hola!

          Podrías echarle un ojo al Curso de Backend con Node.js

        Abraham Serrano Montiel

        Abraham Serrano Montiel

        student•
        hace 6 años

        Una duda, ¿Por que se pone event.target ?

          Gabriel De Andrade

          Gabriel De Andrade

          student•
          hace 6 años

          El event.target hace referencia al Elemento que llamó al evento, de esta manera podemos por ejemplo obtener el valor de ese Elemento :D

          Luis Alberto Ruiz Sarmiento

          Luis Alberto Ruiz Sarmiento

          student•
          hace 6 años

          Debes tener en cuenta que no siempre lo vas a encontrar así, hay ocaciones que lo veras de la siguiente forma:

          handleInput={(e) => e.target}

          La e es una variable y la puedes nombrar a tu gusto, solo que habitualmente se maneja con event o e

        Manuel Rivera

        Manuel Rivera

        student•
        hace 6 años

        en las devtools podemos observar los props que tiene cada componente, es una ayuda muy grande para debuggear también

        Javier Fuentes Mora

        Javier Fuentes Mora

        teacher•
        hace 6 años

        Tambien pueden usar react-redux-form les ayuda . amanejar los estados y les ayud a aimplementar validaciones

        Andrés Felipe Eslava Zuluaga

        Andrés Felipe Eslava Zuluaga

        student•
        hace 5 años

        Login.jsx

        import React, { useState } from 'react'; import { Link } from 'react-router-dom'; import googleIcon from '../assets/img/google-icon.png'; import twitterIcon from '../assets/img/twitter-icon.png'; import '../assets/styles/containers/Login.scss'; const Login = () => { const [formValues, setFormValues] = useState({ email: '', password: '', }); const handleInput = (event) => { setFormValues({ ...formValues, [event.target.name]: event.target.value, }); }; const handleSubmit = (event) => { event.preventDefault(); console.log('formValues', formValues); }; return ( <section className='Login'> <section className='Login__container'> <h3>Inicia sesión</h3> <form className='Login__container--form' action='' onSubmit={handleSubmit} > <input className='input' type='text' name='email' id='email' placeholder='Correo' onChange={handleInput} /> <input className='input' type='password' name='password' id='password' placeholder='Contraseña' onChange={handleInput} /> <button className='button' type='submit'>Iniciar sesión</button> <div className='Login__container--remember-me'> <label htmlFor='cbox1'> <input type='checkbox' name='cbox1' id='cbox1' value='Checkbox' /> Recuérdame </label> <Link to='/forgot-password'> Olvidé mi contraseña </Link> </div> </form> <section className='Login__container--social-media'> <div> <img src={googleIcon} alt='Google' /> inicia sesión con Google </div> <div> <img src={twitterIcon} alt='Twitter' /> inicia sesión con Twitter </div> </section> <p className='Login__container--register'> No tienes ninguna cuenta? <Link to='/register'> Regístrate </Link> </p> </section> </section> ); }; export default Login;
        Juan Daniel Martínez Navarro

        Juan Daniel Martínez Navarro

        student•
        hace 5 años

        Para quien le sirva encontré la forma de cambiar el color del header según la ruta en la que te encuentres.

        Primero nos ubicamos en el componente Header para agregarle una propiedad y poder cambiarle el estilo "dinámicamente":

        const Header = ({ color }) => ( <header className={`header ${color}`} > ...

        Como ven le agregué la propiedad llamada color (No se me ocurrió un mejor nombre 🥴) que esta la vamos a agregar al className de <header>, dejando su clase original .header para no afectar la estructura ni posicionamiento.

        Luego nos dirijimos al componente Layout que es donde importamos el componente Header.

        Necesitamos importar useLocation de router DOM

        import { useLocation } from 'react-router-dom';

        Ahora como ya lo hemos hecho con muchos componentes, necesitamos adaptar nuestro componente Layout para agregar lógica.

        const Layout = ({ children }) => { const pathname = useLocation().pathname; //Obtenemos la ruta actual return ( <div className="App"> { pathname == '/login' | pathname == '/register' ? <Header color='header__login' /> : <Header /> } {children} <Footer /> </div> ); };

        En una constante pathname guardamos la ruta en la que nos encontremos actualmente al navegar en nuestra app por medio de useLocation().pathname.

        Lo siguiente que hicimos fue hacer un condicional, en caso de que la ruta actual sea /login o /register usamos la etiqueta de nuestro componente Header con el valor de color='header__login' la cual es la clase CSS la cual contendrá solamente el color verde.

        Agregamos dicha clase en Header.scss:

        .header__login { background-color: #21c08b; }

        Ya con esto les debería funcionar, prueben cambiando del Home al Login, Register y viceversa.

        Miguel Angel Ochoa Torres

        Miguel Angel Ochoa Torres

        student•
        hace 6 años

        trate de devolverme algunos videos para verlos de nuevo, pero aparecen al 100%. porfa que aparezca el avance pero que el video vuelva a iniciar de 0

          José Enrique Pérez Aquino

          José Enrique Pérez Aquino

          student•
          hace 6 años

          Puedes presionar 0 justo después de que carga el vídeo para regresarlo al principio

          Rafael Mujica

          Rafael Mujica

          student•
          hace 6 años

          Hola, yo desactive el autoplay (en el engranaje ) asi que cuando me regreso a algún video ya visto no me redirecciona al siguiente y luego si ubico el video al inicio o al punto que necesite. Saludos

        Steve Anthony Luzquiños Agama

        Steve Anthony Luzquiños Agama

        student•
        hace 5 años

        Hola, para hacer validaciones les sugiero usar los siguientes regex en el email y password:

        const EMAIL_REGEX = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ const PASSWORD_REGEX = /^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[!"#\$%&'\(\)\*\+,-\.\/:;<=>\?@[\]\^_`\{\|}~])[a-zA-Z0-9!"#\$%&'\(\)\*\+,-\.\/:;<=>\?@[\]\^_`\{\|}~]{6,}$/

        El primero lo obtuve de aquí, el segundo de aquí.

        Para enviar al usuario un mensaje de éxito o fracaso puede usar SweetAlert2.

        Finalmente, les comparto mis validaciones

        const handleSubmit = e => { e.preventDefault() console.log(form) if (!EMAIL_REGEX.test(form.email)) return Swal.fire({ icon: 'error', title: 'Email inválido', text: 'Debes ingresar un email válido' }) if (!PASSWORD_REGEX.test(form.password)) return Swal.fire({ icon: 'error', title: 'Contraseña inválida', html: 'Debes ingresar una contraseña con:<br><br>' + '- 6 caracteres<br>' + '- Una minúsclia<br>' + '- Una mayúsclia<br>' + '- Un número<br>' + '- Un caracter especial<br>' }) return Swal.fire({ icon: 'success', title: 'Inicio de sesión exitoso', timer: 1500 }) }

        Happy coding!

        Beto Martinez

        Beto Martinez

        student•
        hace 6 años

        No entiendo como el setValues "setea" los valores Este codigo en especifico, lo desestructura el form y ¿Despues que?

        const handleInput = (event) => { setValues({ ...form, [event.target.name]: event.target.value, }); };```
          Christian Perez

          Christian Perez

          student•
          hace 6 años

          Hola! Recuerda que en hooks useState toma dos valores:

          const [form, setValues] = useState({ email: '' })

          Durante el renderizado inicial, el estado devuelto (form) es el mismo que el valor pasado como primer argumento ({email: " "}). Por la tanto comienza vacío.

          El segundo argumento es con el que actualizamos el estado.

          Cuando llamas a handleInput esta funcion destructura y toma el valor de form y en este caso crea un objeto dinámica mente el cual pasa a ser el nuevo estado

          { event.target.email: event.target.value; event.target.password: event.target.value }

          Aquí esta la documentación de hooks, por si le quieres dar una revisada. No me encanta leer jeje pero personalmente se me hizo super clara.

          David Antonio Garcia Saaib

          David Antonio Garcia Saaib

          student•
          hace 6 años

          A ok xD, de manera general lo que pasa ahi es que cada cambio que hagas al string del un input se guarda en automatico el ...form es para que guarde su valor anterior y la linea que sigue es para si hay algun cambio en alguno de los dos inputs lo guarde en su espacio correspondiente

          Todo eso esta en setValues que es una funcion que da valor a form.

          Ponlo asi, cada letra o borrado de letra se actualiza el valor de form, no del form html si no del form hook, o la variable form , o el objeto form que estamos declarando con JS y useState

        Mateo Buitrago

        Mateo Buitrago

        student•
        hace 6 años

        Una pregunta, por qué se utilizan los [] en [event.target.name]:event.target.value ?

          Cristian Fabian Tovar

          Cristian Fabian Tovar

          student•
          hace 6 años

          05:40 dice que es para obtener de forma dinámica la información, es decir que en esa línea puede estar alterando: event.target.email ó event.target.password Dependerá del input que se esté alterando en el momento, cualquier duda te invito a romper el código en esa sección y ver lo que pasa en la consola del navegador, es divertido y te ayuda a comprender por tí mismo lo que ocurre

          David Antonio Garcia Saaib

          David Antonio Garcia Saaib

          student•
          hace 6 años

          es como iterar en el target, en lugar de poner uno para email y uno para password que guarde el valor pone eso para que se guarde en el target.name correspontiene ya sea email, password u otro

        Jhonatan David Ibarra Lavado

        Jhonatan David Ibarra Lavado

        student•
        hace 6 años

        repasando la clase , estupendo

        Jorge Alberto Rodriguez Flores

        Jorge Alberto Rodriguez Flores

        student•
        hace 5 años

        Igual también podemos poner un objeto vació en nuestro useState y funcionara.