CursosEmpresasBlogLiveConfPrecios

Vistas Híbridas

Clase 18 de 23 • Curso de Next.js 2018

Clase anteriorSiguiente clase

Contenido del curso

Introducción a Next.JS

  • 1

    ¿Dónde aprender Next.js actualizado?

    00:14 min
  • 2
    ¿Qué es Next.JS?

    ¿Qué es Next.JS?

    01:41 min
  • 3
    Creando nuestra primera página

    Creando nuestra primera página

    07:44 min
  • 4
    Styled JSX

    Styled JSX

    09:54 min

Server Side Rendering

  • 5
    Aprende qué es Server Side Rendering

    Aprende qué es Server Side Rendering

    04:15 min
  • 6
    Intro a getInitialProps

    Intro a getInitialProps

    14:44 min
  • 7
    Utilizando el componente Link

    Utilizando el componente Link

    08:01 min
  • 8
    Recibiendo Parámetros

    Recibiendo Parámetros

    13:20 min
  • 9
    Performance de Get Initial Props

    Performance de Get Initial Props

    04:39 min
  • 10
    Vista de Podcasts

    Vista de Podcasts

    02:07 min

Componentes Reutilizables

  • 11
    Creando componentes en React

    Creando componentes en React

    15:16 min
  • 12
    Reorganizar la vista de podcasts

    Reorganizar la vista de podcasts

    03:03 min

Navegación Avanzada

  • 13
    Gestionando Errores

    Gestionando Errores

    14:06 min
  • 14
    Personalizando errores

    Personalizando errores

    10:21 min
  • 15
    ¿Cómo diseñar URLs?

    ¿Cómo diseñar URLs?

    03:34 min
  • 16
    Configurando Next Routes

    Configurando Next Routes

    11:26 min
  • 17
    Implementando Next Routes

    Implementando Next Routes

    08:04 min
  • 18
    Vistas Híbridas

    Vistas Híbridas

    Viendo ahora
  • 19
    Implementar el Modal

    Implementar el Modal

    06:24 min
  • 20
    Agregando un loader

    Agregando un loader

    03:44 min

Publicando nuestra app

  • 21
    Mejores prácticas en Github

    Mejores prácticas en Github

    04:33 min
  • 22
    Publicar la app con now

    Publicar la app con now

    02:39 min
  • 23
    Conclusiones del curso

    Conclusiones del curso

    01:07 min
Tomar examen
Resumen

En esta clase vamos a ver algo muy particular, y tiene que ver con cómo implementar vistas híbridas. Conoceremos una de las funcionalidaes de React que es: setState(), que nos permite cambiar el estado de los componentes.

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
        Cristian Camilo Cucunubá

        Cristian Camilo Cucunubá

        student•
        hace 7 años

        Codigo Con React Hooks :

        const [openPodcast, setPodcast] = useState(null); const setOpenPodcast = (event, podcast) => { event.preventDefault() setPodcast(podcast) }

        Y no cree el otro componente para tener el elemento onClick, simplemte agregue el evento en la etiqueta hija <a> del Link.

          Johan Stivens Suarez Galindo

          Johan Stivens Suarez Galindo

          student•
          hace 6 años

          Hola bro, primero que todo gracias por compartir tu código! Me surge una duda, si los hooks no se pueden usar en clases, lo que hiciste fue crear un nuevo componente o modificar channel para funcione sin clase? Porque lo intento modificar pero el problema es el "static async getInitialProps()...", gracias!

        William Velázquez

        William Velázquez

        student•
        hace 8 años

        Hola Roberto! 😃
        ¿hay alguna diferencia si para inicializar el estado en lugar de usar el constructor explícitamente lo realizo de la siguiente forma?:

        export default class extends React.Component{ state = { openPodcast: null } ...

        De antemano muchas gracias y un saludo! 🤚

          Diego Forero

          Diego Forero

          Team Platzi•
          hace 8 años

          Lo mejor es usar el constructor, por estándar y por facilidad de lectura del código.

          William Velázquez

          William Velázquez

          student•
          hace 8 años

          Muchas gracias! ¿El usarlo así tiene algún problema en rendimiento o en algún otro aspecto?

        Javier Ignacio

        Javier Ignacio

        student•
        hace 7 años

        a día de hoy, ¿los chicos de next.js fixearon el tema del link?

          Jose Daniel Atencio Manzanillo

          Jose Daniel Atencio Manzanillo

          student•
          hace 7 años

          misma pregunta me hago ... supongo que tendra una solucion porque que feo incrustar un componente solo para hacer onClick ...

          Esteban Ciudad

          Esteban Ciudad

          student•
          hace 7 años

          a mi me funciona de la siguiente manera, añado el onclick al elemento a y dejo el componente Link igual con sus params:

          {audioClips.map(clip => ( <Link route="podcast" params={{ slugChannel: slug(clip.channel.title), idChannel: clip.channel.id, slug: slug(clip.title), id: clip.id }} > <a className="podcast" onClick={event => onClickPodcast(event, clip)} > <h3>{clip.title}</h3> <div className="meta"> {Math.ceil(clip.duration / 60)} minutes </div> </a> </Link> ))}
        Johan Stivens Suarez Galindo

        Johan Stivens Suarez Galindo

        student•
        hace 6 años

        Alguien me podría explicar como lo implementó con Hooks? Porque como los hooks no se pueden usar en clases y channel.js es una, me surge la duda... gracias!

          esteban meza betancur

          esteban meza betancur

          student•
          hace 6 años

          Hola bro tienes que tener un prototipo de función en vez de uno de clase y por otra parte mira el video de hooks del curso de react,js es muy bueno

          Pablo Orozco Monte

          Pablo Orozco Monte

          student•
          hace 6 años

          Aquí no doy toda la solución pero esta sería el inicio para la implementación de getInitialProps con hooks

          import React, { useState, useEffect } from "react"; import 'isomorphic-fetch' import Layout from '../components/Layout' import ChannelGrid from '../components/ChannelGrid' import PodcastList from '../components/PodcastList' import PodcastListWithClick from '../components/PodcastListWithClick' import PodcastPlayer from '../components/PodcastPlayer' import Error from './_error' function Channel({ reqChannel, reqSeries, reqAudios, statusCode }) { const [openPodcast, setOpenPodcast] = useState(null); if( statusCode !== 200 ) { return <Error statusCode={ statusCode } /> } // aquí la lógica de la vista return( // TODO ) } Channel.getInitialProps = async ({ req, res }) => { try { let [reqChannel, reqSeries, reqAudios] = await Promise.all([ fetch(`https://api.audioboom.com/channels/${idChannel}`), fetch(`https://api.audioboom.com/channels/${idChannel}/child_channels`), fetch(`https://api.audioboom.com/channels/${idChannel}/audio_clips`) ]) if( reqChannel.status >= 400 ) { res.statusCode = reqChannel.status return { channel: null, audioClips: null, series: null, statusCode: reqChannel.status } } let dataChannel = await reqChannel.json() let channel = dataChannel.body.channel let dataAudios = await reqAudios.json() let audioClips = dataAudios.body.audio_clips let dataSeries = await reqSeries.json() let series = dataSeries.body.channels return { channel, audioClips, series, statusCode: 200 } } catch(e) { return { channel: null, audioClips: null, series: null, statusCode: 503 } } } };
        Miguel Angel Morales Larriega

        Miguel Angel Morales Larriega

        student•
        hace 7 años

        No es necesario escribir el constructor para un state:

        state= { openPodcast: null }

        openPodcast = (e, podcast) => { e.preventDefault(); this.setState({ openPodcast: podcast }) }

        //Otra forma de mostrar codigo a partir de una validación es la siguiente: {(openPodcast)?<div>Hay un podcast abierto</div>: null}

          Diego Ivan Padilla Bernal

          Diego Ivan Padilla Bernal

          student•
          hace 7 años

          Lo del inicializar el state estas en lo correcto, más que nada para simplificar código, pero lo de la otra forma de validar funciona pero sería escribir un poco de código extra así que en ese casi se es mejor como lo hizo el profesor

        Ramiro Nicolas DAccorso Rosati

        Ramiro Nicolas DAccorso Rosati

        student•
        hace 6 años

        Ya se actualizo el componente link? Porque next va por la versión 9+ y en el curso esta la 6.1

        Ivan Magdaleno

        Ivan Magdaleno

        student•
        hace 6 años

        Por qué menciona el Link de Next? No se supone que desde la clase pasada estamos usando el Link de next-routes en lugar del Link de Next?

        walter Jorge

        walter Jorge

        student•
        hace 7 años

        hola me sale lo siguiente
        Error in ./pages/channel.js
        Module not found: Error: Can’t resolve ‘…/components/PodcastListWidthClink’ in 'D:\podcasts\pages’
        ModuleNotFoundError: Module not found: Error: Can’t resolve ‘…/components/PodcastListWidthClink’ in 'D:\podcasts\pages’
        at factoryCallback (D:\podcasts\node_modules\webpack\lib\Compilation.js:276:40)
        at factory (D:\podcasts\node_modules\webpack\lib\NormalModuleFactory.js:235:20)
        at resolver (D:\podcasts\node_modules\webpack\lib\NormalModuleFactory.js:60:20)
        at asyncLib.parallel (D:\podcasts\node_modules\webpack\lib\NormalModuleFactory.js:127:20)
        at D:\podcasts\node_modules\async\dist\async.js:3888:9
        at D:\podcasts\node_modules\async\dist\async.js:473:16
        at iteratorCallback (D:\podcasts\node_modules\async\dist\async.js:1062:13)
        at D:\podcasts\node_modules\async\dist\async.js:969:16
        at D:\podcasts\node_modules\async\dist\async.js:3885:13
        at resolvers.normal.resolve (D:\podcasts\node_modules\webpack\lib\NormalModuleFactory.js:119:22)
        at onError (D:\podcasts\node_modules\enhanced-resolve\lib\Resolver.js:65:10)
        at loggingCallbackWrapper (D:\podcasts\node_modules\enhanced-resolve\lib\createInnerCallback.js:31:19)
        at runAfter (D:\podcasts\node_modules\enhanced-resolve\lib\Resolver.js:158:4)
        at innerCallback (D:\podcasts\node_modules\enhanced-resolve\lib\Resolver.js:146:3)
        at loggingCallbackWrapper (D:\podcasts\node_modules\enhanced-resolve\lib\createInnerCallback.js:31:19)
        at next (D:\podcasts\node_modules\tapable\lib\Tapable.js:252:11)

          Diego Forero

          Diego Forero

          Team Platzi•
          hace 7 años

          Revisa que no tengas un error de digitación, por lo que veo esta buscando el archivo PodcastListWidthClink creo que sobra la n en el Clink y por eso no encuentra el archivo.

          walter Jorge

          walter Jorge

          student•
          hace 7 años

          ok me voy a fijar quisas no me dicuenta.
          gracias

        Santiago Marcano

        Santiago Marcano

        student•
        hace 7 años

        He aprendido mucho con este curso aunque este video sin duda ha sido el mas confuso. Es raro picar código y no saber para que si no hasta el final del video. Creo que seria mejor explicar a detalle la funcionalidad que se quiere implementar antes de picar todo el código y mas aun si se está haciendo un "hack" para que funcione en Next.

          Platzi Team

          Platzi Team

          student•
          hace 7 años

          Lo hizo, al principio del video, la idea es que puedas cargar en un modal el podcast que es seleccionado con un "click" para que no tenga que abrir otra página, sino que lo abra en la misma, pero en un modal. Esto resulta mas eficiente porque no tienes que hacerle un tiro a la API para traer el podcast, que puede ser mas costoso en tiempo y recursos cuando en el listado ya te trae todo el detalle del podcast, solo es usarlo. Saludos

        Platzi Team

        Platzi Team

        student•
        hace 7 años

        Me queda la duda, si no es necesario hacer bind del metodo openPodcast como se suele hacer en React. algo como:

        this.openPodcast = this.openPodcast.bind(this);
          Diego Ivan Padilla Bernal

          Diego Ivan Padilla Bernal

          student•
          hace 7 años

          cuando se usa una arrow function no es necesario hacer eso.

        Miguel angel longart ramos

        Miguel angel longart ramos

        student•
        hace 5 años

        hola como estan soy nuevo en Next js y si quiero agregar una seccion como un Menu que estan en otro proyecto lo quiero ingresar con ESI esi:include react js pero teno la duda si debe ser en el index o uno d elos archivos de _Document o _App

        Leo Islas

        Leo Islas

        student•
        hace 6 años

        duda estoy apenas tomando el curso y me gusto bastante ya que me ayuda bastante en la parte de SEO de paginas dinamicas pero estaticas al final mi pregunta es veo que usan para partes de funcionalidad puro class components pero ¿puedo usar Hooks ? ósea functional components

          Gabriel De Andrade

          Gabriel De Andrade

          student•
          hace 6 años

          Hola! Si puedes usar Hooks, lo que pasa es que este curso se grabó antes de que esta feature saliera en React, pero en Platzi siempre se actualizan los cursos así que no te preocupes por que se quede viejo tampoco :D