DEV Community

Cover image for Renderización Dinámica de Componentes en Vue 3 y Nuxt 3: Guía Práctica y Caso Real
Samuel
Samuel

Posted on

Renderización Dinámica de Componentes en Vue 3 y Nuxt 3: Guía Práctica y Caso Real

Componentes dinámicos en Vue y Nuxt: Guía Práctica y Caso Real

Nuxt 3 ofrece una forma flexible y muy potente de renderizar diferentes componentes basados en condiciones dinámicas. Esto es especialmente útil cuando el componente exacto a renderizar no se puede determinar hasta el tiempo de ejecución.

Configuración Básica

Para empezar, asegúrate de tener un componente que deseas resolver dinámicamente. Por ejemplo, supongamos que tenemos un componente llamado MyButton que queremos usar dinámicamente:

<script setup lang="ts">
import { SomeComponent } from '#components'

const MyButton = resolveComponent('MyButton')
</script>
Enter fullscreen mode Exit fullscreen mode

En el script anterior, usamos resolveComponent para resolver dinámicamente el componente MyButton. Este método es útil cuando los componentes necesitan cargarse de manera condicional o cuando se trata de aplicaciones grandes donde los componentes se cargan bajo demanda.

Uso de Componentes Dinámicos en Plantillas

Una vez que hemos resuelto nuestros componentes, podemos usarlos en la sección de la plantilla. La etiqueta <component> en Vue 3 (y por lo tanto en Nuxt 3) permite la renderización dinámica de componentes. Aquí tienes un ejemplo:

<template>
  <component :is="clickable ? MyButton : 'div'" />
  <component :is="SomeComponent" />
</template>
Enter fullscreen mode Exit fullscreen mode

En esta plantilla:

  1. La primera etiqueta <component> usa una operación ternaria para decidir si renderizar el componente MyButton o un simple elemento div basado en la condición clickable.
  2. La segunda etiqueta <component> renderiza SomeComponent directamente.

Explicación Técnica

  • resolveComponent: Esta función se utiliza para resolver dinámicamente un componente por su nombre. Devuelve un componente que se puede usar en tu plantilla.
  • <component :is="...">: Esta etiqueta especial de componente te permite especificar qué componente renderizar dinámicamente usando el atributo :is.

Beneficios de los Componentes Dinámicos

  • Flexibilidad: Los componentes dinámicos permiten a los desarrolladores crear aplicaciones más flexibles y modulares. Los componentes pueden renderizarse basándose en interacciones del usuario, el estado de la aplicación u otras condiciones dinámicas.

Ejemplo en un Caso Real

En un caso real, necesitaba cargar dinámicamente componentes según la ruta. Aquí tienes un ejemplo de cómo se puede lograr esto:

<script lang="ts" setup>
import { UiVerticalNavigation, UiNavigationAccordion, UiBreadCrumbs } from '#components';
const route = useRoute()
const component = route.params.component as string

const componentList = [
  {
    label: 'Vertical Navigation',
    id: 'vertical-navigation',
    component: UiVerticalNavigation
  },
  {
    label: 'Navigation Links (PRO)',
    id: 'navigation-accordion',
    component: UiNavigationAccordion,
    pro: true
  },
  {
    label: 'Breadcrumbs',
    id: 'breadcrumbs',
    component: UiBreadCrumbs
  }
]

const currentComponent = componentList.find(c => c.id === component)
</script>

<template>
  <UContainer class="p-5 mt-32">
   <div v-if="component && currentComponent">
     <h1 class="text-4xl font-bold py-4">{{ currentComponent.label }}</h1>
     <component :is="currentComponent.component" />
   </div>
   <div v-else class="">
     <h1 class="text-4xl font-bold">Component not found</h1>
   </div>
  </UContainer>
</template>

<style>
</style>
Enter fullscreen mode Exit fullscreen mode

En este ejemplo:

  1. Importación de Componentes: Importamos los componentes que queremos renderizar dinámicamente (UiVerticalNavigation, UiNavigationAccordion, UiBreadCrumbs).
  2. Obtención de la Ruta: Utilizamos useRoute para obtener la ruta actual y el parámetro component de la URL.
  3. Lista de Componentes: Creamos una lista de componentes con sus etiquetas, identificadores y referencias a los componentes importados.
  4. Selección del Componente Actual: Encontramos el componente actual en la lista basado en el identificador de la URL.
  5. Renderización en la Plantilla: Utilizamos <component :is="currentComponent.component" /> para renderizar el componente seleccionado dinámicamente. Si no se encuentra el componente, mostramos un mensaje de "Component not found".

Este enfoque permite que la aplicación cargue y renderice componentes específicos basados en la ruta actual, lo cual es útil para crear interfaces de usuario dinámicas y adaptativas.

Conclusión

Usa componentes dinámicos, es un recurso que te puede ahorra muchos dolores de cabeza

Top comments (0)