CursosEmpresasBlogLiveConfPrecios

Proyecto: Validar inputs

Clase 10 de 23 • Curso de Programación Funcional en JavaScript por Bedu

Clase anteriorSiguiente clase

Contenido del curso

Introducción al curso y conceptos base

  • 1
    Qué aprenderás sobre la programación funcional

    Qué aprenderás sobre la programación funcional

    01:57 min
  • 2
    Programación funcional: qué es

    Programación funcional: qué es

    00:15 min
  • 3
    Boilerplate: Base para el proyecto del curso

    Boilerplate: Base para el proyecto del curso

    02:16 min

Funciones

  • 4
    Funciones Algebraicas y Funciones de JavaScript

    Funciones Algebraicas y Funciones de JavaScript

    02:49 min
  • 5
    Qué son funciones puras

    Qué son funciones puras

    02:45 min
  • 6
    Proyecto: Obtener el valor de los inputs

    Proyecto: Obtener el valor de los inputs

    04:00 min
  • 7
    Objetos y Tipos de Memoria en JavaScript

    Objetos y Tipos de Memoria en JavaScript

    04:31 min
  • 8
    Copiar y modificar objetos en JavaScript

    Copiar y modificar objetos en JavaScript

    09:49 min
  • 9
    Utilizando inmutabilidad en nuestras funciones

    Utilizando inmutabilidad en nuestras funciones

    03:49 min
  • 10
    Proyecto: Validar inputs

    Proyecto: Validar inputs

    Viendo ahora

Estado compartido en funciones

  • 11
    Estado compartido o shared state

    Estado compartido o shared state

    06:24 min
  • 12
    Proyecto: Agregar elementos a la lista

    Proyecto: Agregar elementos a la lista

    05:36 min

Composición de funciones, Closures y Currying

  • 13
    Funciones compuestas o Function Composition

    Funciones compuestas o Function Composition

    09:34 min
  • 14
    Completando las funciones para generar etiquetas HTML

    Completando las funciones para generar etiquetas HTML

    06:14 min
  • 15
    Closures en programación funcional

    Closures en programación funcional

    02:56 min
  • 16
    Currying

    Currying

    03:14 min
  • 17
    Proyecto: Construyendo filas y celdas

    Proyecto: Construyendo filas y celdas

    03:45 min

Higher Order Functions

  • 18
    Introducción a las Higher Order Functions

    Introducción a las Higher Order Functions

    04:11 min
  • 19
    Proyecto: Actualizando el total de calorías

    Proyecto: Actualizando el total de calorías

    05:32 min
  • 20
    Proyecto: Mostrar elementos

    Proyecto: Mostrar elementos

    03:36 min
  • 21
    Proyecto: Eliminar elementos

    Proyecto: Eliminar elementos

    09:45 min

Bonus: Declarative Programming

  • 22
    Programación Declarativa

    Programación Declarativa

    06:30 min

Conclusiones

  • 23
    Conclusiones

    Conclusiones

    01:30 min
  • Tomar el examen del curso
    • Nathaly Stefani Riaño Bejarano

      Nathaly Stefani Riaño Bejarano

      student•
      hace 7 años

      Con VanillaJS:

      let description = document.getElementById('description') let calories = document.getElementById('calories') let carbs = document.getElementById('carbs') let protein = document.getElementById('protein') const validateInputs = () => { description.value ? '' : description.classList.add('is-invalid') calories.value ? '' : calories.classList.add('is-invalid') carbs.value ? '' : carbs.classList.add('is-invalid') protein.value ? '' : protein.classList.add('is-invalid') if(description.value && calories.value && carbs.value && protein.value) { console.log('OK!') } } description.addEventListener('keydown', () => description.classList.remove('is-invalid')) calories.addEventListener('keydown', () => calories.classList.remove('is-invalid')) carbs.addEventListener('keydown', () => carbs.classList.remove('is-invalid')) protein.addEventListener('keydown', () => protein.classList.remove('is-invalid'))
        Miguel Herreros Cejas

        Miguel Herreros Cejas

        student•
        hace 7 años

        Muchas gracias por tu aporte. Llevo tiempo sin programar en Jquery y me ha sido de gran utilidad.

        Ana Lilia Ortega Torres

        Ana Lilia Ortega Torres

        student•
        hace 5 años

        Muchas gracias :)

      Diego Antonio Gomez Diaz

      Diego Antonio Gomez Diaz

      student•
      hace 7 años

      Mi ejemplo:

      const IS_INVALID = 'is-invalid' const description = document.getElementById('description') const calories = document.getElementById('calories') const carbs = document.getElementById('carbs') const protein = document.getElementById('protein') const inputs = [description, calories, carbs, protein] const isValid = elem => elem.value const isFormValid = () => isValid(description) && isValid(calories) && isValid(carbs) && isValid(protein) const showInvalid = elem => isValid(elem) ? '' : elem.classList.add(IS_INVALID) const addKeydownEvent = elem => elem.addEventListener('keydown', () => elem.classList.remove(IS_INVALID)) inputs.forEach(addKeydownEvent) const validateInputs = () => { inputs.forEach(showInvalid) if (isFormValid()) { console.log('OK') } }
        Creck Brayan Mauri Pastor Paredes

        Creck Brayan Mauri Pastor Paredes

        student•
        hace 5 años

        genial buen ejemplo aprendi un par de cosas con este ejemplo

      LUIS EDUARDO CASTILLO GARCIA

      LUIS EDUARDO CASTILLO GARCIA

      student•
      hace 7 años

      Buen video para recordar javascript puro, con frameworks o librerias actualmente el manejo es mas sencillo. Para evitar el uso de JQuery, lo he realizado de otra manera:

      const $ = id => document.getElementById(id); let formInputs = { description: $('description'), calories: $('calories'), carbs: $('carbs'), protein: $('protein'), } const inputEntries = Object.entries(formInputs); const validateInputs = () => { inputEntries.forEach(prop => { if (!prop[1].value) { formInputs[`${prop[0]}`].classList.add('is-invalid'); } }); if(Object.values(formInputs).every(({ value }) => value)) { alert('All inputs are fill') } } const removeInvalidType = () => { inputEntries.forEach(prop => { prop[1].addEventListener('keypress', () => { formInputs[`${prop[0]}`] .classList .remove('is-invalid') }); }) } removeInvalidType();

      Un saludo a la comunidad :)!

        Javier Pérez

        Javier Pérez

        student•
        hace 4 años

        Genial ese ejemplo iLuisCastillo, eres un crack!!

      Maikol Pedroza

      Maikol Pedroza

      student•
      hace 5 años

      Esta es mi solución con vanilla JS. Si tienen dudas porfa comenten :D

      carbon (5).png

      Walter Sosa Tizón

      Walter Sosa Tizón

      student•
      hace 7 años

      Badtante decepcionado del curso, que utilice jQuery en lugar de VanillaJS me desmotiva bastante.

      Gustavo César Ramírez Bautista

      Gustavo César Ramírez Bautista

      student•
      hace 5 años

      Les comparto mi solución con typescript...

      Y les dejo mi repositorio por si quieren echar un vistazo, feedback bienvenido repositorio-gus

      const form = document.getElementById('form') as HTMLFormElement; const validateInputs = (ele: HTMLInputElement) => { ele.value === '' && (ele.classList.add('invalid'), window.setTimeout(() => ele.classList.remove('invalid'), 600)); return { id: ele.id, value: ele.value }; }; const listener = (e: Event) => { e.preventDefault(); const element = e.target as HTMLFormElement; const arr = Object.values(element).map(validateInputs).slice(0, 4); const flag = arr.every((ele) => ele.value !== ''); if (flag) { console.log('OK'); console.log(arr); } }; form.addEventListener('submit', listener);
      Jorge Méndez Ortega

      Jorge Méndez Ortega

      student•
      hace 7 años

      Para todos los que no queremos utilizar jQuery podrias intentar generar la practica usando JS puro también conocido como VanillaJS, les comparto el ejemplo que estoy realizando sin utilizar jQuery se que varios están haciendo lo mismo.

      const compose = (...functions) => data => functions.reduceRight((value, func) => func(value), data) // Se utiliza $ para identificar que una variable o constante hace referencia // a elementos del DOM const $DESCRIPTION = document.getElementById("description"); const $CALORIAS = document.getElementById("calorias"); const $CARBOIDRATOS = document.getElementById("carboidratos"); const $PROTEINAS = document.getElementById("proteinas"); const ERROR_CLASS = "is-invalid"; // Asignacion de evntos siempre que se desea asignar un evento aun elemento del DOM // es necesario utilizar addEventListener $DESCRIPTION.addEventListener("keypress", () => $DESCRIPTION.classList.remove(ERROR_CLASS)); $CALORIAS.addEventListener("keypress", () => $CALORIAS.classList.remove(ERROR_CLASS)); $CARBOIDRATOS.addEventListener("keypress", () => $CARBOIDRATOS.classList.remove(ERROR_CLASS)); $PROTEINAS.addEventListener("keypress", () => $PROTEINAS.classList.remove(ERROR_CLASS)); // funcion para validar los inputs const validateInputs = () => { // Por cuestion de buenas practicas el resultado de una condición // Ternaria tiene que ser asignada a una variable o constante const DESCRIPTION_CLASS = (($DESCRIPTION.value) ? "" : ERROR_CLASS); $DESCRIPTION.classList.add(DESCRIPTION_CLASS); const CALORIAS_CLASS = (($CALORIAS.value) ? "" : ERROR_CLASS); $CALORIAS.classList.add(CALORIAS_CLASS); const CARBOIDRATOS_CLASS = (($CARBOIDRATOS.value) ? "" : ERROR_CLASS); $CARBOIDRATOS.classList.add(CARBOIDRATOS_CLASS); const PROTEINAS_CLASS = (($PROTEINAS.value) ? "" : ERROR_CLASS); $PROTEINAS.classList.add(PROTEINAS_CLASS); if ($DESCRIPTION.value && $CALORIAS.value && $CARBOIDRATOS.value && $PROTEINAS.value) { console.log("Oki Doki"); } };
      Noe Mikhael Huaccharaque Ruiz

      Noe Mikhael Huaccharaque Ruiz

      student•
      hace 7 años

      para Vanilla: classList.add()
      para Jquery: addClass()

      Gabriel De Andrade

      Gabriel De Andrade

      student•
      hace 7 años

      El operador ternario también funciona en el último if y se escribiría de la siguiente manera

      $description.value && $calories.value && $carbs.value && $proteins.value && console.log('works')

      Aunque cabe destacar que es un poco confuso si no se tiene el else por que es el mismo símbolo que la concatenación de condiciones

      Ivan Ruiz Rosello

      Ivan Ruiz Rosello

      student•
      hace 7 años

      Espero que mi código sirva! Si es así hacédmelo saber y seguiré publicándolo :)

      const description = $('#description'); const carbs = $('#carbs'); const calories = $('#calories'); const protein = $('#protein'); removeIsInvalidOnKeyPress = (...inputs) => { for(let input of inputs) { input.keypress(() => { input.removeClass('is-invalid'); }) } } removeIsInvalidOnKeyPress(description, carbs, calories, protein); const isInputValid = input => { const inputValue = input.val(); if(!inputValue) input.addClass('is-invalid'); return Boolean(inputValue); } const inputsAreValid = (...inputs) => { return !inputs .map(input => isInputValid(input)) .includes(false) } const validateInputs = () => { if(inputsAreValid(description, carbs, calories, protein)) { alert('OK') } } ```
      Martín Gutiérrez Hernández

      Martín Gutiérrez Hernández

      student•
      hace 3 años

      Mi solución con métodos array

      Edward Fernandez

      Edward Fernandez

      student•
      hace 6 años

      Hola chicos, les dejo mi código:

      const compose = (...functions) => data => functions.reduceRight((value, func) => func(value), data) let description = document.getElementById('description'); let calories = document.getElementById('calories'); let carbs = document.getElementById('carbs'); let protein = document.getElementById('protein'); description.onkeypress = () => { description.classList.remove('is-invalid'); }; calories.onkeypress = () => { calories.classList.remove('is-invalid'); } carbs.onkeypress = () => { carbs.classList.remove('is-invalid'); } protein.onkeypress = () => { protein.classList.remove('is-invalid'); } const validateInputs = () => { description.value ? '' : description.classList.add('is-invalid'); calories.value ? '' : calories.classList.add('is-invalid'); carbs.value ? '' : carbs.classList.add('is-invalid'); protein.value ? '' : protein.classList.add('is-invalid'); if (description.value && calories.value && carbs.value && protein.value) { console.log('ok'); } }
        Gabriel De Andrade

        Gabriel De Andrade

        student•
        hace 6 años

        Hola! Está cool, pero no utilizaría let en el código pues no hay razón para usarlo y en programación funcional lo mejor es usar constantes siempre :D

        Carlos Enrique Ramírez Flores

        Carlos Enrique Ramírez Flores

        student•
        hace 6 años

        Gracias y que bien que lo haces en vanilla

      David Antonio Ordóñez Cornejo

      David Antonio Ordóñez Cornejo

      student•
      hace 7 años

      Intentando ser muy funcional:

      const compose = (...functions) => data => functions.reduceRight((value, func) => func(value), data) let $description = document.querySelector('#description') let $calories = document.querySelector('#calories') let $carbs = document.querySelector('#carbs') let $proteins = document.querySelector('#proteins') let $addButton = document.querySelector('#add-button') var trackInput = ($input) => { setTimeout(() => { $input.value !== '' ? $input.classList.remove('is-invalid') : $input.classList.add('is-invalid') }, 200) } $description.addEventListener('keypress', trackInput.bind(null, $description)) $calories.addEventListener('keypress', trackInput.bind(null, $calories)) $carbs.addEventListener('keypress', trackInput.bind(null, $carbs)) $proteins.addEventListener('keypress', trackInput.bind(null, $proteins)) const validateInputs = ($inputs) => $inputs.forEach(trackInput) const validateForm = validateInputs.bind(null, [$description, $calories, $carbs, $proteins]) const processInputs = ($inputs, calllback) => { const flag = $inputs.every($input => $input.value !== '') flag === true ? $inputs.forEach($input => { console.log($input.value) }) : console.log('Skipping') } const processForm = processInputs.bind(null, [$description, $calories, $carbs, $proteins], console.log) const manageCaloriesForm = compose(validateForm, processForm) $addButton.addEventListener('click', manageCaloriesForm)
      JAIME URQUIZU

      JAIME URQUIZU

      student•
      hace 7 años

      Mi aportación, con bonito efecto UX:

      • Primero, poned como id del h1 ‘counter’:
      <div class=“card-header”> <h1 id=“counter”>Calories Counter</h1> </div>
      • Segundo:

      let description = $(’#description’) // id’s de los inputs
      let calories = $(’#calories’)
      let carbs = $(’#carbs’)
      let protein = $(’#protein’)

      calories.keypress(() =>{
      calories.removeClass(‘is-invalid’)
      counter.innerHTML=counter.innerHTML==“Por favor, inserta datos”?“Calories Counter”:“Calories Counter”
      })

      carbs.keypress(() =>{
      carbs.removeClass(‘is-invalid’)
      counter.innerHTML=counter.innerHTML==“Por favor, inserta datos”?“Calories Counter”:“Calories Counter”
      })

      description.keypress(() =>{
      description.removeClass(‘is-invalid’)
      counter.innerHTML=counter.innerHTML==“Por favor, inserta datos”?“Calories Counter”:“Calories Counter”
      })

      protein.keypress(() =>{
      protein.removeClass(‘is-invalid’)
      counter.innerHTML=counter.innerHTML==“Por favor, inserta datos”?“Calories Counter”:“Calories Counter”
      })

      const validateInputs = () => {
      description.val() ? ‘’ : description.addClass(‘is-invalid’)
      calories.val() ? ‘’ : calories.addClass(‘is-invalid’)
      carbs.val() ? ‘’ : carbs.addClass(‘is-invalid’)
      protein.val() ? ‘’ : protein.addClass(‘is-invalid’)
      description.val() ? ‘’ : counter.innerHTML=counter.innerHTML==“Calories Counter”?“Por favor, inserta datos”:"Por favor, inserta datos"
      calories.val() ? ‘’ : counter.innerHTML=counter.innerHTML==“Calories Counter”?“Por favor, inserta datos”:"Por favor, inserta datos"
      carbs.val() ? ‘’ : counter.innerHTML=counter.innerHTML==“Calories Counter”?“Por favor, inserta datos”:"Por favor, inserta datos"
      protein.val() ? ‘’ : counter.innerHTML=counter.innerHTML==“Calories Counter”?“Por favor, inserta datos”:“Por favor, inserta datos”
      }

      Daniel González

      Daniel González

      student•
      hace 7 años

      No esta más decir que el callback, reultado de evento de escribir dentro de un input devuleve this en el caso de jQuery y event en el caso de Vanilla, por lo que no es necesario volver a escribir el nombre del input para quitarle la clase:

      const compose = (...functions) => data => functions.reduceRight((value, func) => func(value), data) let $description = $('#description'); let $carbs = $('#carbs'); let $calories = $('#calories'); let $protein = $('#protein'); $description.bind('input', function(){ $(this).removeClass('is-invalid'); }) $carbs.bind('input', function(){ $(this).removeClass('is-invalid'); }) $calories.bind('input', function(){ $(this).removeClass('is-invalid'); }) $protein.bind('input', function(){ $(this).removeClass('is-invalid'); }) const validateInputs = () => { $description.val() ? '': $description.addClass('is-invalid'); $carbs.val() ? '': $carbs.addClass('is-invalid'); $calories.val() ? '': $calories.addClass('is-invalid'); $protein.val() ? '': $protein.addClass('is-invalid'); if($description.val() && $carbs.val() && $calories.val() && $protein.val()){ console.log('ok'); } }
      Fernanda Aragon

      Fernanda Aragon

      student•
      hace 7 años

      Podemos reducir los keypress removiendo los corchetes de cada arrow function 😊

      Nicolás Arias

      Nicolás Arias

      student•
      hace 6 años

      También en lugar de usar el operador ternario para añadir las clases podemos usar el operador &&, de la siguiente forma:

      description.val() && description.addClass('is-invalid')

      El operador and solo ejecuta lo que está después únicamente si la primera expresión da un Truthy.

      Juan Diego Prieto Rodríguez

      Juan Diego Prieto Rodríguez

      student•
      hace 7 años

      Mi aporte :)

      let validaInput = document.querySelector('.mb-2').addEventListener('click', () => { let description = document.getElementById('description'); let calories = document.getElementById('calories'); let carbs = document.getElementById('carbs'); let protein = document.getElementById('protein'); description.value ? '' : description.classList.add('is-invalid'), description.classList.add('is-valid'); calories.value ? '' : calories.classList.add('is-invalid'), calories.classList.add('is-valid'); carbs.value ? '' : carbs.classList.add('is-invalid'), carbs.classList.add('is-valid'); protein.value ? '' : protein.classList.add('is-invalid'), protein.classList.add('is-valid'); description.addEventListener('keypress', () => { description.classList.remove('is-invalid');}); calories.addEventListener('click', () => { description.classList.remove('is-invalid');}); carbs.addEventListener('click', () => { carbs.classList.remove('is-invalid');}); protein.addEventListener('click', () => { protein.classList.remove('is-invalid');}); if(description.value && calories.value && carbs.value && protein.value) { console.log('ok'); } });```
      David Antonio Ordóñez Cornejo

      David Antonio Ordóñez Cornejo

      student•
      hace 7 años

      Mi aporte:

      const compose = (...functions) => data => functions.reduceRight((value, func) => func(value), data) // DOM elements let $description = document.querySelector('#description') let $calories = document.querySelector('#calories') let $carbs = document.querySelector('#carbs') let $proteins = document.querySelector('#proteins') let $addButton = document.querySelector('#add-button') // Update an input field depending of input value var trackInput = ($input) => { setTimeout(() => { if ($input.value !== '') { $input.classList.remove('is-invalid') } }, 250) } // Add handlers to validate keypresses $description.addEventListener('keypress', trackInput.bind(null, $description)) $calories.addEventListener('keypress', trackInput.bind(null, $calories)) $carbs.addEventListener('keypress', trackInput.bind(null, $carbs)) $proteins.addEventListener('keypress', trackInput.bind(null, $proteins)) // Validate a list of input fields const validateInputs = ($inputs) => { $inputs.forEach($input => { if ($input.value === '') { $input.classList.add('is-invalid') } else { $input.classList.remove('is-invalid') } }) } // Bind inputs before to make the function point free const validateForm = validateInputs.bind(null, [$description, $calories, $carbs, $proteins]) // Process the inputs const processInputs = ($inputs, calllback) => { const flag = $inputs.every($input => $input.value !== '') if (flag === true) { $inputs.forEach($input => { console.log($input.value) }) } } // Bind inputs before to make the function point free const processForm = processInputs.bind(null, [$description, $calories, $carbs, $proteins], console.log) // Compose validateForm and ProcessForm in one general event handler const manageCaloriesForm = compose(validateForm, processForm) // Add the composed handler to validate and process the form $addButton.addEventListener('click', manageCaloriesForm)
      José María Cuevas Ramírez

      José María Cuevas Ramírez

      student•
      hace 6 años

      ¿Qué tal comunidad? Les dejo mi implementación para quitar la clase "is-invalid" . Lo que hice fue colocar un id al elemento padre en común de los 4 inputs, a este le puse al eventListener y mediante event bubbling puedo obtener cual de todos los elementos fue activado para así quitar la clase. . De este modo solo estoy agrando 1 eventListener en lugar de 4

      const $inputsRow = document.querySelector('#inputs-row') $inputsRow.addEventListener('keypress', event =&gt; event.target.classList.remove('is-invalid'))

      . Una ventaja es que de este modo si después fuéramos a agregar o quitar inputs no habría necesidad de modificar el código de JS. .

      :)

    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