Mixins Vue: compartir lógica entre componentes
Clase 37 de 53 • Curso Profesional de Vue.js 2
Contenido del curso
CLI y Dev Tools
- 3

Instalación de Vue.js: Node, Dev Tools y CLI
06:13 min - 4

Crear una aplicación Vue con CLI y webpack
12:49 min - 5

Cómo funciona webpack.config.js
10:38 min - 6

Babel: transpilador de JavaScript moderno
05:06 min - 7

ESLint con Standard JS: linteo automático en webpack
15:34 min - 8

Configuración de Sass y Bulma en Vue
06:18 min - 9

Cómo configurar Pug en Vue con webpack
04:23 min - 10
Diseño de Mockups: Práctica y Colaboración en Comunidad
00:20 min - 11
Creación de Vistas con Mockups y Vue.js
00:32 min
Manipulación del DOM
- 12

Expresiones en Vue: sintaxis doble llave
03:49 min - 13

Diferencia entre v-show y v-if en el DOM
06:22 min - 14

Qué es data binding en Vue.js
04:11 min - 15

Computed properties en Vue.js: cómo crearlas
04:13 min - 16

Qué son los watchers de Vue
02:25 min - 17

Eventos Vue: directiva v-on y métodos format
06:12 min - 18

Cómo construir una interfaz de búsqueda completa en Vue
19:03 min - 19
Manipulación del DOM con Vue.js: Práctica y Ejercicios
03:00 min
REST y HTTP
Sistema de Componentes
- 23

Cómo crear componentes en Vue
08:46 min - 24

Componentes Layout en Vue con Bulma
09:50 min - 25

Reactividad en Vue: $set y Object.assign
06:14 min - 26

Hooks del ciclo de vida en Vue.js
05:38 min - 27

Comunicación padre-hijo con props en Vue
23:27 min - 28

Eventos en Vue: comunicar hijo a padre
12:04 min - 29

Slots: HTML dinámico en componentes Vue
13:42 min - 30

Plugin Event Bus: comunicar componentes sin relación en Vue
19:19 min
Vue Router
Extendiendo VueJS
Clases, Animaciones y Transiciones36
Vuex
- 39

Cómo Vuex centraliza estados en Vue
03:41 min - 40

Instalación de Vuex con estado único
17:32 min - 41

Cómo usar mutations y commit en Vuex
08:16 min - 42

Getters de Vuex: mapGetters y store sincronizado
07:35 min - 43

Cómo dispatch ejecuta actions asincrónicas en ViewX
07:54 min - 44

Instalación de Viewex en Platzi Music
26:37 min
Nuxt.js
Deploy a Producción con Now
Conclusiones
Bonus
Los mixins en Vue.js permiten reutilizar lógica entre componentes sin duplicar código. Aquí verás cómo crear un trackMixin, mover el método selectTrack y aplicarlo en los componentes de Platzi Music: track y trackDetail, manteniendo el comportamiento, los eventos y la claridad de la vista.
¿Qué son los mixins en Vue.js y por qué convienen?
Los mixins aplican una especie de herencia por combinación: en lugar de sobrescribir, Vue hace un merge de las opciones del mixin con las del componente. Así, puedes compartir data, computed, methods, watchers y directives del viewModel sin perder cambios. En cambio, el HTML no se mezcla con mixins: para eso están los componentes.
- Reutilización de funcionalidad entre múltiples componentes sin copiar y pegar.
- Merge automático de opciones: no se pisan, se combinan.
- Múltiples mixins por componente: útil para lógicas transversales como una propiedad isLoading.
- Plantillas aparte: el mixin comparte lógica, no estructura de HTML.
¿Cómo crear y exportar un mixin para tracks?
Se organiza el proyecto creando la carpeta mixins dentro de source y el archivo track.js. Allí se define el objeto trackMixin con la lógica compartida y se exporta.
¿Qué estructura mínima debe tener el mixin?
- Archivo: source/mixins/track.js.
- Objeto: trackMixin con las opciones del viewModel que quieras compartir.
- Exportación con export default para importarlo luego en los componentes.
// source/mixins/track.js
const trackMixin = {
methods: {
selectTrack () {
// lógica existente para seleccionar y emitir el track.
// se copió desde el componente original.
}
}
}
export default trackMixin
¿Qué lógica compartir entre track y trackDetail?
Se identificó que ambos necesitan el método selectTrack para seleccionar una canción y emitir eventos al reproductor. Esa lógica se mueve al mixin para no mantenerla en dos lugares.
- Se copia selectTrack desde el componente track.
- Se elimina del componente y se centraliza en el mixin.
- Luego se inyecta en cada componente con la propiedad mixins.
¿Cómo mejorar la vista de trackDetail sin duplicar HTML?
Se crea una vista propia en trackDetail sin el componente pmTrack, usando clases de Bulma como is-3, is-8, text-center, panel y media object. El HTML queda en el componente, mientras la lógica se delega al mixin.
- Imagen del álbum con la primera portada:
<img :src="track.album.images[0].url" alt="Portada del álbum" />
- Botón de reproducción con evento click ligado a selectTrack:
<button class="button is-primary is-large" @click="selectTrack">Play</button>
- Lista dinámica de propiedades del objeto track usando la directiva de iteración v-for con objeto: claves y valores.
<ul>
<li v-for="(value, key) in track" :key="key">
<strong>{{ key }}</strong>: <span>{{ value }}</span>
</li>
</ul>
Nota: los mixins no comparten HTML, solo lógica; la plantilla se construye en cada componente.
¿Cómo implementar el mixin en track y trackDetail?
La integración es directa: se importa el mixin y se registra con la propiedad mixins. Así el componente accede a selectTrack sin duplicar código.
¿Cómo importar e inyectar el mixin?
- Importación con import usando el alias definido.
- Registro en el arreglo mixins del componente.
// dentro de track.vue o trackDetail.vue
import trackMixin from '@mixins/track'
export default {
mixins: [trackMixin],
// props, data, created, etc., propios del componente.
}
¿Qué validar después de mover la lógica?
- En track: probar la búsqueda y el botón de play para confirmar que selectTrack sigue emitiendo y el reproductor responde.
- En trackDetail: verificar que el botón activa la misma lógica compartida y que la UI nueva con Bulma se renderiza correctamente.
- En herramientas de desarrollo de Vue: comprobar que el componente mantiene su estado y eventos.
¿Qué ventajas obtienes al refactorizar con mixins?
- Menos duplicación y mantenimiento más simple: cambias en un solo lugar.
- Consistencia en la emisión de eventos entre vistas.
- Posibilidad de agregar otros mixins para estados transversales como isLoading sin mezclar responsabilidades.
¿Te gustaría comentar qué otra lógica moverías a un mixin en tu proyecto Vue o qué patrón reutilizas para mantener tus componentes limpios?