Crear aplicaciones con Vue.js es fácil, divertido y agradable. Puede construir una aplicación de trabajo con el mínimo esfuerzo. Para demostrarlo, hoy te mostraré lo fácil que es construir tu propio reproductor de música con todas las funciones. Para hacer las cosas aún más fáciles, usaremos Vuetify.js, una biblioteca de interfaz de usuario impulsada por Vue.js, que acelerará la construcción de la interfaz de usuario. Casi puedo sentir tu impaciencia, así que empecemos.
Puede encontrar el código fuente completo en el repositorio de GitHub. Y aquí está la demostración de trabajo. Para seguir este tutorial, debe estar familiarizado con los componentes de Vue, los componentes de un solo archivo de Vue y la sintaxis de ES2015..
Cada creación comienza con una idea y al menos una planificación básica. Entonces, primero debemos decidir qué queremos construir y qué funcionalidad queremos implementar. Se dice que una imagen vale más que mil palabras, así que comencemos con un simple boceto del reproductor de música..
Hice esta estructura alámbrica para que pueda obtener una idea general de la interfaz de usuario que queremos crear. El siguiente paso es describir la funcionalidad que pretendemos implementar..
Como dice John Johnson:
Primero, resuelve el problema. Luego, escribe el código.
Usaremos eso como una fuente de sabiduría y planearemos la aplicación antes de comenzar a codificarla.
Vue.js es un marco basado en componentes. Por lo tanto, primero debemos dividir la aplicación en componentes individuales (cinco en nuestro caso, como se muestra en el esquema anterior), y describir las características y la funcionalidad de cada uno de ellos..
Este componente contendrá las siguientes partes:
Este componente mostrará información básica sobre la pista actualmente reproducida:
Este componente contendrá dos barras, que incluirán todos los controles necesarios para manipular las pistas de audio en la lista de reproducción del reproductor.
Este componente contendrá la lista de reproducción de las pistas con la siguiente funcionalidad:
Este componente ofrecerá la funcionalidad de búsqueda en los casos en que deseamos encontrar y reproducir pistas en particular..
Por supuesto, el esquema anterior no puede cubrir todos los detalles y matices, y esto está perfectamente bien. Por ahora, es suficiente para nosotros obtener una imagen general del producto final. Manejaremos todos los detalles y eventuales desafíos durante el proceso de construcción..
Así que entremos en la parte divertida y escribamos un código!
La página de inicio rápido de Vuetify ofrece muchas opciones para comenzar. Usaremos una de las plantillas de CLI de Vue prefabricadas llamada Webpack Simple. Ejecute los siguientes comandos en el directorio que desea usar para este proyecto:
Primero, instale Vue CLI:
$ npm install -g vue-cli
Luego, crea la aplicación:
$ vue init vuetifyjs / webpack-simple vue-music-player
A continuación, vaya al directorio de la aplicación e instale todas las dependencias:
$ cd vue-music player $ npm install
Usaremos Howler.js (una biblioteca de audio de JavaScript) para manejar las partes de audio del reproductor de música. Así que tenemos que incluirlo también en el proyecto. Ejecuta el siguiente comando:
$ npm instalar --save howler
Y por último, ejecuta la aplicación:
$ npm ejecutar dev
La aplicación se abrirá en localhost: 8080
en su navegador predeterminado. Deberías ver un simple esqueleto de la aplicación Vuetify.
Para ajustarlo a nuestras necesidades, necesitamos limpiar la plantilla y modificarla un poco. Renombrar App.vue archivo a Jugador.vue, ábrelo, borra todo lo que está dentro y agrega lo siguiente:
Envolvemos nuestra aplicación de reproductor de música en el v-app
componente, que se requiere para que la aplicación funcione correctamente. También pasamos el oscuro
prop, para aplicar el tema oscuro Vuetify.
Ahora, abre el main.js archivo, elimine el contenido original y agregue lo siguiente:
importar Vue desde 'vue' importar Vuetify desde 'vuetify' importar 'vuetify / dist / vuetify.css' importar Player desde './Player.vue' importar Howl, Howler desde 'howler' Vue.use (Vuetify) new Vue (el: '#app', render: h => h (Jugador))
Además, abre el index.html archivo y cambiar el contenido de la
etiqueta para Vue Music Player.
Ahora, en tu navegador, deberías ver una página oscura vacía. Y voilá. Estás listo para empezar a crear..
Antes de comenzar a codificar, es bueno saber que Vuetify ofrece fragmentos de código y autocompletar para los principales editores de código: VS Code, Atom y Sublime. Para obtener los fragmentos, busque la extensión en su editor favorito (vuetify-vscode
, o vuetify-atom
, o vuetify-sublime
).
En el src directorio, crea un nuevo componentes carpeta. Luego, en esa carpeta, crea el PlayerTitleBar.vue Archivo con el siguiente contenido:
auriculares MENÚAcerca de Vue Music Player
Versión 1.0.0 DE ACUERDO VUE MUSIC PLAYER retirar check_box_outline_blank cerrar
Aquí, usamos los siguientes componentes de Vuetify: barra de herramientas, menú, botón, icono, lista, diálogo y tarjeta.
Separamos el menú, el nombre y los iconos con la tecla
componente. Para mostrar u ocultar el diálogo, creamos el diálogo: falso
propiedad de datos Su valor cambiará cuando hagamos clic en el Acerca de opción del menú.
Ahora en el Jugador.vue archivo, importe el componente de la barra de título, regístrelo en el objeto de componentes y agréguelo a la plantilla.
// AÑADIR el componente en la plantilla
Ahora, comprueba el resultado en tu navegador. Deberías ver lo siguiente:
Repetiremos estos tres pasos para los otros cuatro componentes. Entonces, cuando en las siguientes secciones le pido que importe, registre y agregue un componente en la plantilla, debe seguir el mismo procedimiento que se describe aquí..
En el directorio raíz, cree un nuevo lista de reproducción y agregue los archivos de audio que desea reproducir. Los nombres de los archivos deben escribirse con guiones bajos entre las palabras y un .mp3 extensión al final, por ejemplo, Recordar_la_Vía.mp3. Ahora, crea una matriz de pistas de audio dentro Jugador.vueobjeto de datos:
lista de reproducción: [título: "Streets of Sant'Ivo", artista: "Ask Again", aullido: null, display: true, title: "Remember the Way", artista: "Ask Again", aullido: null, display: true,…]
Cada pista tiene título
y artista
propiedades, una aullido
objeto establecido en nulo
, y un monitor
propiedad establecida en cierto
.
los monitor
propiedad será utilizada cuando implementamos la funcionalidad de búsqueda. Ahora está configurado para cierto
Para todas las pistas, para que todas sean visibles..
Howler envuelve un archivo de audio en una aullido
objeto. Nosotros fijamos aullido
a nulo
porque lo rellenaremos dinámicamente en la creación de la instancia de Vue. Para ello, utilizamos los de Vue. creado
gancho de ciclo de vida.
created: function () this.playlist.forEach ((track) => let file = track.title.replace (/ \ s / g, "_") track.howl = new Howl (src: ['. /playlist/$file.mp3 ']))
Esto establecerá un nuevo Aullido
Objeto para cada pista en la lista de reproducción..
Ahora, crea el PlayerPlaylistPanel.vue componente y agregar esto dentro:
index track.artist - track.title track.howl.duration ()
Primero, pasamos el pilar. lista de reproducción
desde el Jugador.vue expediente. A continuación, en la plantilla, recorremos cada pista con la v-para
Directriz y muestra el índice de la pista, seguido por el artista y el título de la pista, y la duración de la pista en el extremo derecho. También usamos v-show
atado a la monitor
propiedad. Una pista solo será visible si monitor
es cierto
.
Ahora en el Jugador.vue archivo, importamos, registramos y agregamos el componente de lista de reproducción en la plantilla. Entonces, nos unimos el lista de reproducción
apoyo a la lista de reproducción
propiedad de datos como esta:
.
Veamos el resultado en el navegador:
Hay dos problemas aquí. Primero, los números de las pistas no son correctos, y segundo, la duración de la pista se muestra en milisegundos, pero queremos que sea en minutos. Arreglaremos cada uno de estos problemas creando un filtro de formato..
En el main.js archivo, crea un números
filtro y un minutos
Filtro, que será accesible globalmente. Siguiente, en PlayerPlaylistPanel.vue, Los usamos así: index | números
y track.howl.duration () | minutos
.
Ahora, si compruebas la aplicación, todo debería mostrarse correctamente..
En el Jugador.vue archivo, agregue el selectedTrack: null
propiedad de datos y vincularla al componente de lista de reproducción (: selectedTrack = "selectedTrack"
). Luego, pasamos el puntal en el PlayerPlaylistPanel.vue expediente (selectedTrack: Objeto
).
También agregamos un detector de eventos de clic a
y luego crear el selectTrack ()
método:
métodos: selectTrack (track) this. $ emit ('selecttrack', track)
Ahora, de vuelta en Jugador.vue
, añade el pista de selección
evento al componente de lista de reproducción (@ selecttrack = "selectTrack"
) y crea el selectTrack ()
método:
selectTrack (track) this.selectedTrack = track
Ahora, si vas a la lista de reproducción y haces clic en una pista, se seleccionará. No podemos verlo, pero podemos probarlo en Vue DevTools. En la siguiente captura de pantalla, se selecciona la segunda pista:
El siguiente paso es hacer visible la selección. Para hacerlo, enlazaremos una clase que coloreará la pista seleccionada en naranja y otra clase que hará que las filas parciales se vean más oscuras para que las pistas sean más distinguibles. Coloque lo siguiente después de la v-show
directiva:
: class = "[selected: track === selectedTrack, even: index% 2 == 0]"
También agregaremos otra clase, que mostrará una barra de desplazamiento cuando la lista sea demasiado grande..
Añadimos las clases necesarias al final del archivo..
Y eso es. Ahora, la pista seleccionada se resalta en naranja.
Agregaremos la funcionalidad de doble clic al final de la siguiente sección..
Vamos a crear los controles del jugador ahora. Comenzaremos con los botones de reproducción, pausa y parada..
Crear el PlayerControlsBars.vue componente y agregar esto dentro:
detener play_arrow pausa
Aquí, usamos el componente de la barra de herramientas Vuetify.
Hay tres botones con escuchas de eventos de clics registrados. Vamos a crear los métodos para ellos:
métodos: playTrack (index) this. $ emit ('playtrack', index), pauseTrack () this. $ emit ('pausetrack'), stopTrack () this. $ emit ('stoptrack')
Ahora en el Jugador.vue archivo, importar, registrar y agregar el componente en la plantilla. Luego, registre a los oyentes del evento (@ playtrack = "jugar"
, @ pausetrack = "pausa"
, @ stoptrack = "stop"
).
A continuación, crea el índice: 0
Propiedad de datos, que contendrá el índice de la pista actual. Luego, crea un computado currentTrack ()
:
calculado: currentTrack () return this.playlist [this.index]
Y ahora podemos empezar a crear el jugar
, pausa
, y detener
metodos Comenzaremos con el jugar()
método, pero antes de eso tenemos que crear el jugando: falso
propiedad de datos, que indicará si la pista se está reproduciendo o no. Agregue el siguiente código para el jugar()
método:
play (index) deje selectedTrackIndex = this.playlist.findIndex (track => track === this.selectedTrack) if (typeof index === 'number') index = index else if (this.selectedTrack) if (this.selectedTrack! = this.currentTrack) this.stop () index = selectedTrackIndex else index = this.index let track = this.playlist [index] .howl if (track.playing ()) return else track.play () this.selectedTrack = this.playlist [index] this.playing = true this.index = index
El método toma un índice como parámetro, que especifica la pista a reproducir. Primero, obtenemos el índice de la pista seleccionada. Luego, hacemos algunas verificaciones para determinar el valor del índice
. Si un índice se proporciona como un argumento y es un número, entonces lo usamos. Si se selecciona una pista, usamos el índice de la pista seleccionada. Si la pista seleccionada es diferente de la actual, usamos el detener()
Método para detener el actual. Finalmente, si no se pasa un argumento de índice ni se selecciona una pista, usamos el valor de índice
propiedad de datos.
Luego, obtenemos el aullido (basado en el valor del índice) de la pista y verificamos si se está reproduciendo. Si lo es, no devolvemos nada; si no lo es, lo jugamos.
Finalmente, actualizamos el Seleccionado
, jugando
y índice
propiedades de datos.
Vamos a crear ahora pausa()
y detener()
metodos.
pause () this.currentTrack.howl.pause () this.playing = false, stop () this.currentTrack.howl.stop () this.playing = false
Aquí, simplemente hacemos una pausa o paramos la pista actual y actualizamos la jugando
propiedad de datos.
Hagamos también una pista para empezar a tocar haciendo doble clic..
Añadir @ dblclick = "playTrack ()"
a
en el PlayerPlaylistPanel.vue y crea el playTrack ()
método:
playTrack (índice) this. $ emit ('playtrack', índice)
Registrar el oyente @ playtrack = "jugar"
en el Jugador.vue archivar y listo.
Añadamos ahora los botones anterior y siguiente..
skip_previous omitir próximo
Crear el skipTrack ()
método:
skipTrack (direction) this. $ emit ('skiptrack', direction)
Registrar el oyente del evento (@ skiptrack = "saltar"
) en Jugador.vue.
Y crea el omitir()
método:
skip (direction) let index = 0 if (direction === "next") index = this.index + 1 if (index> = this.playlist.length) index = 0 else index = this. índice - 1 si < 0) index = this.playlist.length - 1 this.skipTo(index) , skipTo (index) if (this.currentTrack) this.currentTrack.howl.stop() this.play(index)
Primero comprobamos si la dirección es siguiente
. Si es así, incrementamos el índice en 1. Y si el índice se vuelve más grande que el último índice en la matriz, entonces comenzamos nuevamente desde cero. Cuando la direccion es prev
, disminuimos el índice en 1. Y si el índice es menor que cero, entonces usamos el último índice. Al final, utilizamos el índice
como un argumento para el pasemos a()
método. Detiene la pista actual y reproduce la siguiente o la anterior..
Así es como se ve el jugador con los botones:
Agregue lo siguiente antes de todos los botones:
Aquí, usamos el componente deslizante Vuetify.
Añade el volumen: 0.5
propiedad de datos, y luego crear el updateVolume ()
método:
updateVolume (volumen) Howler.volume (volumen)
Aquí, usamos el objeto global Howler para configurar el volumen globalmente para todos los aullidos.
Además, debemos sincronizar el volumen de Howler inicial, que por defecto está establecido en 1, con el volumen
propiedad. Si no lo haces, el volumen mostrará 0.5 pero inicialmente será 1. Para ello, utilizaremos el creado
enganchar de nuevo:
created: function () Howler.volume (this.volume)
Queremos ver el nivel de volumen como un porcentaje a la derecha del control deslizante de volumen, por lo que agregamos esto en la plantilla: this.volume * 100 + '%'
Ahora, agregamos un icono de volumen antes del control deslizante.
volume_up volume_down volume_mute volume_off
El icono cambiará de acuerdo a los valores de la volumen
y apagado
propiedades.
Añade el silenciado: falso
propiedad de datos y crear el toggleMute ()
método:
toggleMute () Howler.mute (! this.muted) this.muted =! this.muted
Usamos el objeto global Howler nuevamente para configurar el silencio globalmente, y luego alternamos el apagado
valor.
En la captura de pantalla a continuación, puede ver cómo debe verse el control deslizante de volumen:
Agregue lo siguiente después de todos los botones:
repetir repetir
Añade el bucle: falso
propiedad en Jugador.vue, atarlo : loop = "loop"
y pasar el apoyo (bucle: booleano
) en PlayerControlsBars.vue.
Ahora, vamos a crear el toggleLoop ()
método:
toggleLoop () this. $ emit ('toggleloop',! this.loop)
Ahora, de vuelta en Jugador.vue, registrar el oyente del evento (@ toggleloop = "toggleLoop"
) y crea el toggleLoop ()
método:
toggleLoop (value) this.loop = value
En este punto, nos enfrentamos a un pequeño problema. Cuando una pista busca el final, simplemente se detiene. El jugador no se mueve a la siguiente pista, ni repite la pista actual. Para arreglar eso, necesitamos agregar lo siguiente a la creado
función después de la src
propiedad:
onend: () => if (this.loop) this.play (this.index) else this.skip ('next')
Ahora, cuando el lazo
está encendido, la pista actual se repetirá. Si está apagado, el jugador se moverá en la siguiente pista.
Agregue lo siguiente después del botón de repetición:
barajar barajar
Añade el barajar: falso
propiedad en Jugador.vue
, atarlo: shuffle = "shuffle"
), y pasar el apoyo (barajar: booleano
) en PlayerControlsBars.vue
.
Ahora, vamos a crear el toggleShuffle ()
método;
toggleShuffle () this. $ emit ('toggleshuffle',! this.shuffle)
Ahora, de vuelta en Jugador.vue, registrar el oyente del evento (@ toggleshuffle = "toggleShuffle"
) y crea el toggleShuffle ()
método:
toggleShuffle (value) this.shuffle = value
Ahora, agregue lo siguiente a la omitir()
método después índice = 0
:
lastIndex = this.playlist.length - 1 if (this.shuffle) index = Math.round (Math.random () * lastIndex) while (index === this.index) index = Math.round (Math.random () * lastIndex) else if (direction === "next") …
Así es como debería verse tu aplicación ahora:
Primero en Jugador.vue, crear el buscar: 0
propiedad. Entonces tendremos que ver el jugando
Propiedad para actualizar la búsqueda..
watch: playing (playing) this.seek = this.currentTrack.howl.seek () permite a updateSeek if (playing) updateSeek = setInterval (() => this.seek = this.currentTrack.howl.seek () , 250) else clearInterval (updateSeek),
Esto actualizará el valor de búsqueda cuatro veces por segundo..
Ahora, crea un computado Progreso()
:
progress () if (this.currentTrack.howl.duration () === 0) return 0 return this.seek / this.currentTrack.howl.duration ()
Enlazarlo: progress = "progress"
) en la plantilla.
Ahora en PlayerControlsBars.vue, pasa el Progreso
prop (progreso: numero
) y agrega otra barra de herramientas debajo de la que ya hemos creado:
Aquí, usamos el componente de progreso Vuetify.
Crear un computado sigue el progreso()
, Lo que conseguirá el progreso de la pista como porcentaje..
calculado: trackProgress () return this.progress * 100,
Y ahora, crea el updateSeek ()
método:
updateSeek (event) let el = document.querySelector (". progress-linear__bar"), mousePos = event.offsetX, elWidth = el.clientWidth, porcentajes = (mousePos / elWidth) * 100 este. $ emit ('updateseek', porcentajes)
Aquí, obtenemos el elemento de la barra de progreso, que utiliza el .progress-linear__bar
clase. Encontré esto con el navegador DevTools. A continuación, obtenemos la posición del ratón y el ancho de la barra. Entonces, obtenemos la posición del clic del ratón como un porcentaje.
De nuevo en Jugador.vue, añadir y registrar el detector de eventos (@ updateseek = "setSeek"
) y crea el setSeek ()
método:
setSeek (porcentajes) let track = this.currentTrack.howl if (track.playing ()) track.seek ((track.duration () / 100) * porcentajes)
¡Y bum! Puede usar el mouse para cambiar la posición de la pista reproducida.
Crear el PlayerInfoPanel.vue Archivo con el siguiente contenido:
trackInfo.artist - trackInfo.title
trackInfo.seek | minutos / trackInfo.duration | minutos
Aquí, pasamos un pilar. trackInfo
, que utilizamos para rellenar la información de la pista en nuestro componente.
Ahora, de vuelta en Jugador.vue, Importar, registrar y agregar el componente en la plantilla..
Luego, crea un computado getTrackInfo ()
:
getTrackInfo () let artist = this.currentTrack.artist, title = this.currentTrack.title, seek = this.seek, duration = this.currentTrack.howl.duration () return artist, title, seek, duration,
A continuación, lo atamos en la plantilla (: trackInfo = "getTrackInfo"
) y voilá. Obtenemos información básica sobre la pista que se reproduce actualmente, como se puede ver en la captura de pantalla a continuación..
Crear el PlayerSearchBar.vue Archivo con el siguiente contenido:
Creamos un campo de texto y añadimos el desgarrable
prop para mostrar un icono de limpieza cuando escribimos algo.
Mediante el uso modelo v
, lo atamos a la cadena de búsqueda
, que es una cadena vacía inicialmente. Y añadimos un oyente de entrada de eventos..
También pasamos el lista de reproducción
prop, que utilizamos en el searchPlaylist ()
método. En este método, utilizamos el monitor
propiedad y gire apagado
para cada pista donde el título o el artista no coinciden con la cadena de búsqueda, y lo mantenemos o lo giramos en
para todos los partidos. Finalmente, si la cadena de búsqueda está vacía o es igual a nulo
, lo que sucede cuando despejamos el campo con el botón de borrar, giramos en
la monitor
para todas las pistas.
Ahora, de vuelta en Jugador.vue, Importar, registrar y agregar el componente en la plantilla..
Enlazar la propiedad de la lista de reproducción (: playlist = "playlist"
) y comprueba la funcionalidad. Aquí es cómo debe verse en acción:
Como puede ver, con un objetivo claro y una planificación adecuada, construir una aplicación Vue / Vuetify puede ser realmente fácil y agradable. Ahora tiene un reproductor de música que puede usar durante su tiempo de relajación o codificación. Por supuesto, siempre hay espacio para nuevas mejoras y adiciones, así que aquí hay algunas ideas que puede probar para hacer que el jugador sea aún más rico en características:
En este tutorial, vimos lo fácil y divertido que puede ser crear una aplicación con Vue.js, y con Vuetify.js en particular. Espero que hayas disfrutado construyendo este jugador tanto como yo. Estaré encantado de ver tu propia versión mejorada del reproductor. Así que si creas uno, solo suelta un enlace de demostración en los comentarios!