CursosEmpresasBlogLiveConfPrecios

Formulario de Login con Redux

Clase 17 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

    10:08 min
  • 17
    Formulario de Login con Redux

    Formulario de Login con Redux

    Viendo ahora
  • 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 el examen del curso
    • Andrés Felipe Eslava Zuluaga

      Andrés Felipe Eslava Zuluaga

      student•
      hace 5 años

      Creo que con éste paso del Login fue mucho más entendible la forma en qué se construye la forma de manejar la información con Redux: Pensemos siempre en ésta imagen:

      redux.png
      ++1. El componente:++ Siempre debe estar suscrito al Store para saber, por medio del reducer, cómo va a actualizar la información del estado. Esto significa que al tener esa conexión podemos realizar el envío (dispatch) de las acciones al Reducer. ++2. Actions:++ Las acciones por sí solas son un sencillo objeto, que por buena práctica se retornan en una función. Esta función es pasada al Reducer para poder realizar la función / acción (action) que corresponde a la estructura de la aplicación. ++3. El Reducer:++ Es la función que determina los cambios de estado de la aplicación. Es acá donde ocurren los cambios del estado (Store). Es una función pura que devuelve un objeto con el estado actual, después de haber ejecutado la acción que corresponda:

      • Si tiene un llamado por medio de una acción enviada desde el componente, ejecutará alguna acción que corresponda a la interacción del usuario
      • Si es la primera vez que se ejecuta, o sea el estado incial, igualmente ejecuta una acción, que se ve reflejada como el retorno del estado inicial, un estado default que devuelve el estado del Store. ++4. El Store:++ Es quién contiene el estado de todo el aplicativo, la única fuente de verdad (hablando en los términos de Redux), El sitio que contiene el estado del todo el aplicativo.
      • Tiene conexión con el Componente si éste se encuentra suscrito (o conectado), - Comprende las acciones enviadas desde el Componente para que el Reducer le diga cómo debería determinar su estado. . Espero les ayude, a mí me ayudó mucho. Les dejo algo de apoyo haciendo click acá
        Jimmy Buriticá Londoño

        Jimmy Buriticá Londoño

        student•
        hace 5 años

        Gracias por el resumen

        Matías Wasiak

        Matías Wasiak

        student•
        hace 5 años

        Buen aporte!

      Nick David Fuenmayor Molinares

      Nick David Fuenmayor Molinares

      student•
      hace 6 años

      Por si acaso, si alguien tiene el formulario un componente con el formulario y no directamente en el login como lo hice yo van a necesitar un componente mágico de orden superior que se llama withRouter que permite añadir el history a un componente más profundo, dejo el ejemplo de mi código del LoginForm.

      import React, { useState } from 'react'; import { connect } from 'react-redux'; import { Link, withRouter } from 'react-router-dom'; import { loginRequest } from '../actions'; import '../assets/styles/components/LoginForm.scss'; const LoginForm = (props) => { const [isChecked, setIsChecked] = useState(false); const [form, setValues] = useState({ email: '', }); const { history } = props; const handleInput = (event) => { setValues({ ...form, [event.target.name]: event.target.value, }); }; const handleSubmit = (event) => { event.preventDefault(); props.loginRequest(form); history.push('/'); }; return ( <div className='login-section__form-container'> <div className='login-section__form'> <h1 className='form__title'>Inicia sesión</h1> <form onSubmit={handleSubmit}> <input aria-label='Campo de usuario para iniciar sesión' className='input__text' type='text' id='user' name='email' placeholder='Usuario o email' onChange={handleInput} /> <input aria-label='Campo de contraseña secreta para iniciar sesión' className='input__text' type='password' id='pass' name='pass' placeholder='Contraseña' onChange={handleInput} /> <label className={isChecked ? 'input__check--label label-checked' : 'input__check--label input__check--label-before'} htmlFor='remember'> <input onClick={() => setIsChecked(!isChecked)} className='input__check' type='checkbox' name='remember' id='remember' /> Recordar sesión </label> <button className='main-btn form-submit' type='submit'>Iniciar sesión</button> </form> <div className='remember-password__container'> <Link className='remember-password__btn' to='/'>¿Haz olvidado tu contraseña?</Link> </div> </div> </div> ); }; const mapDispatchToProps = { loginRequest, }; export default withRouter(connect(null, mapDispatchToProps)(LoginForm));

      Como se dará cuenta, llamo a withRouter desde 'react-router-dom', recibo el history por los props y luego exporto el componente con withRouter.

        David Vargas Domínguez

        David Vargas Domínguez

        student•
        hace 6 años

        Gracias por tu aporte, fue de mucha ayuda. :D

        Félix Andersson

        Félix Andersson

        student•
        hace 6 años

        Me salvaste

      Enrique Yael C

      Enrique Yael C

      student•
      hace 5 años

      recuerden que el boton debe de ser tipo 'submit' si no no va a funcionar su login

      <button className='button' type='submit'>Iniciar sesión</button>```
        Juan Sebastian Torchia

        Juan Sebastian Torchia

        student•
        hace 5 años

        Gracias me estaba fallando por esto! <3

        Rodrigo Rodriguez

        Rodrigo Rodriguez

        student•
        hace 5 años

        En mi caso no lo tengo asi ,

        <button className="button">Iniciar sesión</button>

        Y pareciera que funciona.

      Andrés Campuzano Garzón

      Andrés Campuzano Garzón

      student•
      hace 6 años

      🦄 Acá el código hasta el momento: https://github.com/AndresCampuzano/React-Router-and-Redux/commit/3e00f49a6bb1c042a87a700e81a8621dc406c669

        Santiago Ventura

        Santiago Ventura

        student•
        hace 4 años

        crackk!!!!!!!

      Victor Baruch Pazaran Jaimes

      Victor Baruch Pazaran Jaimes

      student•
      hace 5 años

      Les comparto este codigo que utilice en el header para poder mostrar el nombre de nuestro ususario en el header una vez que ya haya iniciado sesion

      test usuario.JPG

      y aqui el codigo

      import React from 'react'; import { Link } from 'react-router-dom' import { connect } from 'react-redux' import '../assets/styles/components/Header.scss'; import logo from '../assets/images/logo-platzi.png'; import userIcon from '../assets/images/profile-user.svg'; const Header = ({ user }) => { console.log(user.email) return( <header className="header"> <Link to="/"> <img className="header__img" src={ logo } alt="" /> </Link> {/* Usamos el elemento link de react router dom, ya que nos permite poder desplazarnos por nuestra aplicacion sin necesidad de hacer un refres a la pagina completa */} <div className="header__menu"> <div className="header__menu--profile"> <img src={ userIcon } alt="user icon" /> <p>Perfil</p> </div> {user.email !== undefined ? <ul> <li><p>Bienvenido <b>{user.email}</b></p></li> <li><p>Mi perfil</p></li> <li><Link to="/register">Registro</Link></li> </ul> : <ul> <li><Link to="/login">Iniciar sesion</Link></li> </ul> } </div> </header> )}; const mapStateToProps = state => { return { user: state.user, } } export default connect(mapStateToProps,null)(Header);
      José Ocando

      José Ocando

      student•
      hace 6 años

      props.history.push('/')

      Jhonatan David Ibarra Lavado

      Jhonatan David Ibarra Lavado

      student•
      hace 6 años

      estupendo, me esta gustando cada día mas react, tengo que ponerme más autodidacta :D

      Roso Peñaranda

      Roso Peñaranda

      student•
      hace 6 años

      ¿por qué no puedo acceder a user desde props como hago con las otras variables?

      const { user, myList, trends, originals } = props;

      si imprimo por consola user, me dice que no esta definido, ¿como podria acceder a ese valor? al mostar props por cosola puedo ver las variables: myList, trends y original, pero no las otras variables que estan en el initialState

      usando redux-dev-tool veo que si esta funcionando los reducer, pero sigo sin entender por qué no puedo acceder a los otros datos del inicialState

        Roso Peñaranda

        Roso Peñaranda

        student•
        hace 6 años

        Ya solucione, no era suficiente con agregar user a los props que recibe el componente, tenia que agregarlos tambien al mapStateProps, haciendo que quedara así:

        const mapStateToProps = state => { return { user: state.user, myList: state.myList, trends: state.trends, originals: state.originals, }; };
        Markoz Peña Mendez

        Markoz Peña Mendez

        student•
        hace 6 años

        Recuerda que si quieres tener acceso al estado global, no importa por mas anidado que pueda estar el componente. Tienes que usar mapSatetToProps, para inyectar el estado a ese componente para que pueda leerlo.

      Sebastián Rodrigo Díaz

      Sebastián Rodrigo Díaz

      student•
      hace 5 años

      No logro entender como es que el componente le pasa la información al ‘payload’ del ‘action’ cuando se hace la ‘const mapDispatchToProps’. ¿ Como la función que está adentro obtiene los valores de payload del action si no le estamos pasando nada?

        Sebastián Rodrigo Díaz

        Sebastián Rodrigo Díaz

        student•
        hace 5 años

        La respuesta mi pregunta está acá, hay un codigo de ejemplo también:

        https://www.pluralsight.com/guides/different-ways-to-dispatch-actions-with-redux

        Según la página, traté de traducirlo lo mejor que pude:

        “El segundo argumento para la función ‘connect’ es la función ‘mapDispatchToProps’, que es un contenedor para todos los creadores de ‘actions’ usando el el método ‘dispatch’ y al componente. De la documentación oficial para ‘connect’, podemos describir ‘mapDispatchToProps’ de esta manera: si se pasa un objeto, se asume que cada función dentro de él es un creador de ‘actions’ de Redux. Un objeto con los mismos nombres de función, pero con cada creador de ‘actions’ envuelto en una llamada de ‘dispatch’ para que puedan ser invocados directamente, se fusionará con los ‘props’ del componente. Lo anterior implica que no necesitamos despachar nuestras acciones. Solo necesitamos pasar un objeto a "conectar". Luego podemos llamar a las acciones envueltas desde nuestros ‘props’.”

      Paolo Donato Torregrosa Navarro

      Paolo Donato Torregrosa Navarro

      student•
      hace 6 años

      Aun no comprendo del todo esta linea:

      export default connect(null, null)(login);

      Y tampoco el metodo connect de redux en general

        Oscar Barajas Tavares

        Oscar Barajas Tavares

        Team Platzi•
        hace 6 años

        Nos permite conectar nuestra aplicación al flujod e Redux, conecte recibe los siguientes parametros:

        connect() Parameters mapStateToProps?: Function c?: Function | Object mergeProps?: Function options?: Object

        Los primeros dos son los mas utilizados, mapStateToProps nos permite conectar los props del estado al componente y mapStateToProps permite conectar los actions como un prop dentro del componente.

        Manuel Diaz

        Manuel Diaz

        student•
        hace 5 años

        y porque los envias null

      Jorge Alberto Rodriguez Flores

      Jorge Alberto Rodriguez Flores

      student•
      hace 5 años
      Karen Paola Diaz Duarte

      Karen Paola Diaz Duarte

      student•
      hace 5 años

      Súper genial!! prácticas:

      19.png

      18.png
      Fernando Azuaje

      Fernando Azuaje

      student•
      hace 6 años

      como puede ver lo que tengo en el estado? para ver al usuario que se agrega

        Steven Benjamín Diaz Flores

        Steven Benjamín Diaz Flores

        student•
        hace 6 años

        Tengo la misma duda, utilizo las herramientas de desarrollo de Redux, pero de dice que no hay ningún store conectado.

        ReduxUseState.PNG
        Marcelo Gustavo Baez

        Marcelo Gustavo Baez

        student•
        hace 6 años

        Para un uso basico de Redux dev tools, simplemente agregá esta linea (luego de initialState) como parámetro a la funcion createStore:

        const store = createStore( reducer, initialState, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__(), );
      Laura Camila Pregonero

      Laura Camila Pregonero

      student•
      hace 5 años

      Buena clase Profe, comprendì muy bien lo que explicaste!!! Estoy muy feliz de seguir aprendiendo Programación !!!!

      Ruben Peña

      Ruben Peña

      student•
      hace 5 años

      A mi

      props.history.push('/')

      Me da error por que el

      props.history

      es undefined

      alguien sabe que puede pasar?

      este es mi código:

      import React, { useState } from 'react' import { Link } from 'react-router-dom' import { connect } from 'react-redux' import { loginRequest } from '../actions' import '../assets/styles/components/LoginForm.scss' import googleIcon from '../assets/static/google-icon.png' import twitterIcon from '../assets/static/twitter-icon.png' const LoginForm = props => { const [form, setValues] = useState({ email: '', }) const handleInput = event => { setValues({ ...form, [event.target.name]: event.target.value }) } const handleSubmit = (event) => { event.preventDefault() props.loginRequest(form) props.history.push('/') } return ( <section className="login"> <section className="login__container"> <h2>Inicia sesión</h2> <form className="login__container--form" onSubmit={handleSubmit}> <input name="email" className="input" type="text" placeholder="Correo" onChange={handleInput} /> <input name="password" className="input" type="password" placeholder="Contraseña" onChange={handleInput} /> <button className="button">Iniciar sesión</button> <div className="login__container--remember-me"> <label> <input type="checkbox" id="cbox1" value="first_checkbox" />Recuérdame </label> <a href="/">Olvidé mi contraseña</a> </div> </form> <section className="login__container--social-media"> <div><img src={googleIcon} /> Inicia sesión con Google</div> <div><img src={twitterIcon} /> 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> ) } const mapDispatchToProps = { loginRequest, } export default connect(null, mapDispatchToProps)(LoginForm)
        Andres Moreno

        Andres Moreno

        student•
        hace 5 años

        Puedes exportar el component LoginForm con withRouter, pero como en este caso se está usando redux, tienes que exportarlo con compose, de la siguiente forma:

        export default compose( withRouter, connect(null, mapDispatchToProps)(LoginForm) )

        No te olvides de agregar ++withRouter++ en los named-imports de react-router-dom que tienes en la parte de arriba Y ++compose++ es un metodo de la libreria react-redux

        Espero te sea de ayuda, un saludo!

        Andres Moreno

        Andres Moreno

        student•
        hace 5 años

        Perdona, dejame corregir el error que tengo en el codigo anterior Debes exportarlo de la siguiente forma:

        export default compose( withRouter, connect(null, mapDispatchToProps) )(LoginForm);

        Saludos!!

      Jhon Brichman Bellido Vargas

      Jhon Brichman Bellido Vargas

      student•
      hace 4 años

      cambios en el history con la v6 de react-router-dom

      import React, {useState} from "react"; import { connect } from "react-redux"; import {Link,useNavigate } from "react-router-dom"; import { loginRequest } from "../actions"; import googleIcon from "../assets/static/google-icon.png"; import twitterIcon from "../assets/static/twitter-icon.png"; import '../assets/styles/components/Login.scss' const Login = props => { let navigate = useNavigate(); const [form, setValues] = useState({ email: '', }); const handleInput = event => { setValues({ ...form, [event.target.name]: event.target.value }) } const handleSubmit = event => { event.preventDefault(); props.loginRequest(form); console.log(form); navigate('/'); } return ( <section className="login"> <section className="login__container"> <h3>Inicia sesión</h3> <form className="login__container--form" onSubmit={handleSubmit}> <input name="email" className="input" type="text" placeholder="Correo" onChange={handleInput} /> <input name="password" className="input" type="password" placeholder="Contraseña" onChange={handleInput} /> <button className="button" type='submit '>Iniciar sesión</button> <div className="login__container--remember-me"> <label> <input type="checkbox" id="cbox1" value="first_checkbox" />Recuérdame </label> <a href="/">Olvidé mi contraseña</a> </div> </form> <section className="login__container--social-media"> <div><img src={googleIcon}/> Inicia sesión con Google</div> <div><img src={twitterIcon}/> 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> ); }; const mapDispatchToProps = { loginRequest, } export default connect(null, mapDispatchToProps)(Login);
      Miguel Angel Reyes Moreno

      Miguel Angel Reyes Moreno

      student•
      hace 5 años

      Vamos a mandar nuestra información a nuestro estado con Redux. Aquí simulamos un login.

      index.js de actions:

      export const loginRequest = (payload) => ({ type: actions.loginRequest, payload, });

      Login.jsx:

      import { loginRequest } from '../actions'; //*No haec falta escribir el index porque ya se entiende que se quiere ese archivo al tener ese nombre const Login = (props) => { const handleSubmit = (event) => { event.preventDefault(); //*Para que no se haga la acción de enviar formulario props.loginRequest(); props.history.push('/'); //*Redirigimos al usuario al home }; }; const mapDispatchToProps = { loginRequest, }; export default connect(null, mapDispatchToProps)(Login);

      index.js de reducers:

      case actions.loginRequest: return { ...state, user: action.payload, };
      Alejandro Betancur

      Alejandro Betancur

      student•
      hace 6 años

      Hola.. tengo una duda a quien no le guarda la información en el store?

        Nathaly Stefani Riaño Bejarano

        Nathaly Stefani Riaño Bejarano

        student•
        hace 6 años

        Estaba viendo que no se actualiza user en el state... la action se dispara bien, llega al reducer, el action.type hace match con el case, el action.payload tiene la información, pero no la asigna a user 🤷‍♀️

        Luis Rodriguez

        Luis Rodriguez

        student•
        hace 6 años

        hola! pudieron solucionar su problema?

      Ana Paula Santillán Sánchez

      Ana Paula Santillán Sánchez

      student•
      hace 5 años

      Saben cuál es el curso de autentificación de la escuela de JavaScrip? :D

        Carlos Alfonso Garcia Rivera

        Carlos Alfonso Garcia Rivera

        student•
        hace 5 años

        autenticacion con passportjs

      Marco Mesén Campos

      Marco Mesén Campos

      student•
      hace 6 años

      Porqué acá le creamos un state local al component login si lo vamos a pasar a redux?

        Julián Scialabba

        Julián Scialabba

        student•
        hace 5 años

        Porque en el state local vamos guardando los cambios que se van haciendo en los inputs mediante los onChange y al state de redux solo le mandamos este state local con todos los cambios. No estaria bien tener en el state de redux datos de login incompletos.

    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