Directivas personalizadas en Vue: v-blur
Clase 36 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
Crear directivas personalizadas en Vue permite ir más allá de lo que ofrece el framework por defecto y mejorar la UX con reglas reutilizables. Aquí se construye paso a paso una directiva global llamada v-blur para identificar y desactivar pistas sin preview URL en Platzi Music, combinando manipulación del DOM, estilos CSS y validaciones lógicas en componentes.
¿Qué es una directiva personalizada y cuándo conviene?
Las directivas son funciones que manipulan el DOM desde atributos en el template. Cuando las directivas nativas quedan cortas, podemos crear directivas personalizadas para extender la funcionalidad. Se instalan de forma global si se usan en muchos componentes, o local si solo viven en uno o dos.
En Vue, una directiva expone hooks como bind (similar a mounted), update (similar a updated), también unbind y componentUpdated. Cada hook recibe hasta cuatro parámetros: el elemento del DOM (el), el objeto de binding con el value, modifiers y args, y referencias al Virtual DOM actual y previo (newNode, oldNode). En muchos casos, basta con usar el elemento y el binding.
Conceptos clave que se aplican aquí: - Uso de valores truthy/falsy para decidir estilos y estados. - Manipulación del DOM con Vanilla JavaScript: style, querySelectorAll, setAttribute, removeAttribute. - UX consistente: filtro CSS con blur y cursor not-allowed para indicar que no es accionable.
¿Cómo se construye la directiva v-blur paso a paso?
La directiva debe desenfocar imágenes o contenedores cuando el valor asociado (previewUrl) sea falsy, y deshabilitar la interacción con sus botones. Se organiza como un objeto con un método install y un hook bind que delega en una función auxiliar.
¿Cómo aplicar blur, cursor y deshabilitar botones?
Se define una función setBlur(el, binding) que: - Aplica el filtro CSS: el.style.filter = 'blur(3px)' si el valor es falsy; caso contrario 'none'. - Cambia el cursor: 'not-allowed' cuando no hay preview; si no, 'inherit'. - Busca botones internos con querySelectorAll('button') y los deshabilita con setAttribute('disabled', true) cuando el valor es falsy; si es truthy, remueve el atributo con removeAttribute('disabled').
Ejemplo del archivo directives/blur.js:
// directives/blur.js
const blur = {
install(Vue) {
const setBlur = (el, binding) => {
const isUnavailable = !binding.value; // falsy => no hay previewUrl
el.style.filter = isUnavailable ? 'blur(3px)' : 'none';
el.style.cursor = isUnavailable ? 'not-allowed' : 'inherit';
const buttons = el.querySelectorAll('button');
buttons.forEach((btn) => {
if (isUnavailable) {
btn.setAttribute('disabled', true);
} else {
btn.removeAttribute('disabled');
}
});
};
Vue.directive('blur', {
bind(el, binding) {
setBlur(el, binding);
}
});
}
};
export default blur;
Detalles importantes de habilidades aplicadas: - Corregir propiedades de estilo: usar correctamente el.style, no variantes mal escritas. - Cambiar etiquetas por
¿Cómo se instala y se usa en componentes?
Se instala de forma global para que esté disponible en toda la app y luego se aplica en el componente de pista, pasando como valor la propiedad previewUrl.
¿Cómo instalar globalmente en main.js?
// main.js
import Vue from 'vue';
import blur from '@/directives/blur';
Vue.use(blur);
¿Cómo aplicarla en el template del buscador?
Aplicar la directiva al componente de pista, usando el valor que determina si hay preview:
<!-- search.vue -->
<template>
<section>
<pm-track v-blur="track.previewUrl" />
</section>
</template>
¿Cómo reforzar la lógica en métodos para evitar selecciones inválidas?
Además de la señal visual, se bloquea la acción en los métodos que seleccionan o navegan a una pista cuando no existe previewUrl. Patrón de “cortar ejecución” con return temprano.
// track.vue (métodos)
methods: {
selectTrack(track) {
if (!track.previewUrl) return;
// lógica de selección cuando sí hay preview
},
goToTrack(track) {
if (!track.previewUrl) return;
// navegación válida cuando sí hay preview
}
}
Mejoras de UI recomendadas según lo visto: - Reemplazar por
¿Te gustaría comentar otras ideas de directivas útiles o casos donde combinarías estilos y validaciones lógicas para reforzar la experiencia del usuario?