Organiza y acelera tu desarrollo con componentes reutilizables en Vue. Aquí verás, paso a paso, cómo aislar la sección de un producto en un componente propio usando la Options API, registrar su template, data y methods, y montarlo en el orden correcto para lograr estado independiente y mejor mantenimiento.
¿Cómo convertir una sección en un componente reutilizable en Vue?
Componentizar evita copiar y pegar bloques grandes de HTML y lógica. En lugar de duplicar la sección de producto y su descripción, creamos un componente que podremos insertar cuantas veces queramos, cada uno con su propio estado.
Una aplicación ya es un componente: HTML, CSS y JavaScript en un mismo lugar.
Identifica en el template la sección del producto y su descripción.
Objetivo: reutilizar y mantener sin duplicar código.
Resultado: un nuevo tipo de etiqueta HTML personalizada que representa el componente.
¿Qué problemas resuelve la componentización?
Evita duplicación: no más copiar y pegar secciones enteras.
Mejora mantenimiento: cambios en un solo lugar.
Aísla responsabilidades: cada componente maneja su propio estado y métodos.
¿Cómo crear y registrar el componente Product con Options API?
Para crear el componente, se registra con app.component y se definen sus opciones: template, data y methods. Así trasladamos la sección del producto, su estado (por ejemplo, la imagen activa y los códigos de descuento) y su lógica.
// Product.jsapp.component('Product',{template:` <!-- Vue HTML -->
<section class="product">
<!-- HTML del producto y su descripción. -->
</section>
`,data(){return{// product: ...,// activeImage: ...,// discountCodes: ...,};},methods:{// métodos del producto: cambiar imagen, aplicar descuento, etc.}});
Usa un template string para pegar el HTML del producto.
Si usas Visual Studio Code: añade el comentario “Vue HTML” para resaltar sintaxis.
Traslada a data() el estado reactivo del producto: product, activeImage, discountCodes.
Mueve a methods la lógica asociada al producto.
¿Qué rol cumplen template, data y methods?
template: estructura HTML del componente.
data: estado reactivo propio del componente.
methods: funciones que operan sobre ese estado.
¿En qué orden se deben cargar los scripts y montar la app?
El registro del componente debe ocurrir antes de montar la aplicación. Primero se inserta el archivo del componente; después, se crea y monta la app. Así Vue conoce la etiqueta personalizada cuando renderiza.
<divid="app"><product></product></div><!-- Registrar el componente primero --><scriptsrc="Product.js"></script><!-- Luego crear y montar la app --><script>const app =Vue.createApp({/* opciones de la app si aplican */});// Nota: Product ya fue registrado con app.component en Product.js. app.mount('#app');</script>
¿Cómo usar la nueva etiqueta personalizada en el HTML?
Inserta el componente como una etiqueta: <product></product>.
Puedes duplicarlo para múltiples productos: <product></product><product></product>.
Cada instancia tiene estado independiente: cambiar la imagen activa o aplicar un código de descuento afecta solo a esa instancia.
¿Qué pasa con el estado global, como el carrito?
Acciones como add to cart viven en el estado global de la aplicación.
Desde el componente, esa referencia aún no existe: por eso puede “romperse”.
Más adelante se conectará el estado del componente con el global de forma adecuada.
¿Tienes dudas sobre cómo aislar tu lógica o conectar el estado del componente con el global? Comparte tu caso en los comentarios y lo revisamos juntos.
Nombramiento de componentes
Cabe mencionar que un componente puede estar nombrado como kebab-case my-component-name o PascalCase MyComponentName y al instanciarlo como etiquetas, se puede anexar igual, pero dependera de la forma en que se registre, en este vídeo, como global.
La capa de componentes es una de las cosas que más me gustan de Vue, te permite partir el problema en pedacitos y cada componente va con su propio código, y lo mejor de todo es que son reutilizables e independientes, aunque es el mismo código y es el mismo componente, cada uno trabaja por sí solo, es genial!
.
Lo único que no me gusta de usar Vue como CDN es el hecho de tener que poner el template HTML dentro del código JavaScript, por eso me gusta trabajar más con el Vue CLI xD Además, usar el CDN puede tener afectaciones en cuanto a SEO pero ese es otro tema.
.
Dejo el código de la clase:
.
https://github.com/RetaxMaster/vue3-platzi-commerce/tree/d97bfdb8ad0ef4b878a1f7822ebade8618c5fc2a
Para lo del HTML en el template instalamos al inicio la extensión VueHTML en VSCode lo que permite trabajar de manera más cómoda todo ello como si fuera un template normal de Vue
Lo sé, tu extensión me salvó del dolor de ver todo el HTML verde jaja, ¡gracias!
Estaba ansioso por llegar a este módulo, adoro los componentes de Vue
Si no han instalado la extensión de Samuel, este es el ID con el que lo pueden buscar entre las extensiones de VS code:
iosamuel.vuehtml
Gracias capo !
Genial el Plugin Samuel!!! 👌👏
Mi aplicación me muestra el error en consola 'product is not defined' :/
¿Qué hacer en este caso?
¡Hola! :)
Si pudieras compartirnos tu código sería más sencillo encontrar la solución. Puedes copiar y pegar utilizando el botón de </> insertar código. También puedes incluir una captura de pantalla de tu app.
¡Saludos!
mucho cuidado cuando nobre sus componetes en upper por ejemplo:
miComponente, pues en la etiqueta debe ir con mayusculas
<mi-componente />
La extensión VueHTML no me funciona, me formatea el código en el template, pero me quitar todo el formato del archivo index.html.
Este proyecto seria mejor, si se hiciera con el vue cli
Primera vez en mi vida escucho el verbo componetizar. xD
Muy buena clase sobre como componentizar con vue js