Skip to content

Por: Ernesto Canquiz

Anidando Componentes ​

En esta sección, realizaremos un ejemplo práctico utilizando un componente genérico reutilizable que contiene un componente secundario que no es útil por sí solo. Este ejemplo se encuentra en la carpeta ./src/core/components/.

Consideremos el componente RadioGroup.vue, que incluye un componente Radio.vue, el cual, por sí mismo, no tiene funcionalidad. La estructura inicial es la siguiente:

sh
└──src/
   ├──core/
   │  ├──assets/
   │  ├──components/
   │  │  ├──app/
   │  │  │  ├──Avatar.vue
   │  │  │  ├──Button.vue
   │  │  │  ├──Card.vue
   │  │  │  ├──Checkbox.vue
   │  │  │  ├──ErrorMessage.vue
   │  │  │  ├──FlassMessage.vue
   │  │  │  ├──Header.vue
   │  │  │  ├──Input.vue
   │  │  │  ├──Link.vue
   │  │  │  ├──Pagination.vue
   │  │  │  ├──Radio.vue
   │  │  │  ├──RadioGroup.vue
   │  │  │  ├──Select.vue
   │  │  │  └──Textarea.vue    
   │  │  └──icons/ 
   │  ├──composables/
   │  ├──layouts/
   │  ├──middleware/
   │  ├──router/
   │  ├──types/
   │  └──utils/
   └──modules/

Dado que el componente Radio.vue es inútil por sí solo, lo encapsularemos en una nueva carpeta llamada ./src/core/components/RadioGroup/. Además, moveremos el componente RadioGroup.vue a esta carpeta y lo renombraremos a Index.vue para mejorar la organización.

La nueva estructura será:

sh
└──src/
   ├──core/
   │  ├──assets/
   │  ├──components/
   │  │  ├──app/
   │  │  │  ├──Avatar.vue
   │  │  │  ├──Button.vue
   │  │  │  ├──Card.vue
   │  │  │  ├──Checkbox.vue
   │  │  │  ├──ErrorMessage.vue
   │  │  │  ├──FlassMessage.vue
   │  │  │  ├──Header.vue
   │  │  │  ├──Input.vue
   │  │  │  ├──Link.vue
   │  │  │  ├──Pagination.vue
   │  │  │  ├──RadioGroup/
   │  │  │  │  ├──Index.vue
   │  │  │  │  └──Radio.vue
   │  │  │  ├──Select.vue
   │  │  │  └──Textarea.vue    
   │  │  └──icons/ 
   │  ├──composables/
   │  ├──layouts/
   │  ├──middleware/
   │  ├──router/
   │  ├──types/
   │  └──utils/
   └──modules/

TIP

Asegúrese de realizar las actualizaciones necesarias en los lugares donde se importó este componente.

vue
<script setup lang="ts">
// ...
// import AppRadioGroup from "./core/components/app/RadioGroup.vue"
import AppRadioGroup from "./core/components/app/RadioGroup/Index.vue"

// ...
</script>

Ahora, veamos cómo luce la estructura cuando el componente RadioGroup/ está cerrado:

sh
└──src/
   ├──core/
   │  ├──assets/
   │  ├──components/
   │  │  ├──app/
   │  │  │  ├──Avatar.vue
   │  │  │  ├──Button.vue
   │  │  │  ├──Card.vue
   │  │  │  ├──Checkbox.vue
   │  │  │  ├──ErrorMessage.vue
   │  │  │  ├──FlassMessage.vue
   │  │  │  ├──Header.vue
   │  │  │  ├──Input.vue
   │  │  │  ├──Link.vue
   │  │  │  ├──Pagination.vue
   │  │  │  ├──RadioGroup/
   │  │  │  ├──Select.vue
   │  │  │  └──Textarea.vue    
   │  │  └──icons/ 
   │  ├──composables/
   │  ├──layouts/
   │  ├──middleware/
   │  ├──router/
   │  ├──types/
   │  └──utils/
   └──modules/

¡Genial! Ahora se ve más limpio.