Construire des applications avec Vue.js est facile, amusant et agréable. Vous pouvez créer une application qui fonctionne avec un minimum d'effort. Pour vous le prouver, je vais vous montrer aujourd'hui à quel point il est facile de créer votre propre lecteur de musique complet. Pour rendre les choses encore plus faciles, nous utiliserons Vuetify.js, une bibliothèque d’interface utilisateur alimentée par Vue.js, qui accélérera la construction de l’UI. Je peux presque sentir votre impatience, alors commençons.
Vous pouvez trouver le code source complet dans le dépôt GitHub. Et voici la démo de travail. Pour suivre ce didacticiel, vous devez connaître les composants Vue, les composants de fichier unique Vue et la syntaxe ES2015..
Chaque création commence par une idée et au moins une planification de base. Nous devons donc d’abord décider de ce que nous voulons construire et des fonctionnalités que nous voulons implémenter. On dit qu'une image vaut mille mots, alors commençons par un simple croquis du lecteur de musique.
J'ai créé cette structure filaire afin que vous puissiez avoir une idée générale de l'interface utilisateur que nous souhaitons créer. La prochaine étape consiste à décrire la fonctionnalité que nous avons l'intention d'implémenter..
Comme John Johnson le dit:
Tout d'abord, résolvez le problème. Ensuite, écrivez le code.
Nous utiliserons cela comme une source de sagesse et planifierons l'application avant de commencer à la coder..
Vue.js est un framework à base de composants. Nous devons donc tout d'abord diviser l'application en composants individuels (cinq dans notre cas, comme indiqué dans l'esquisse ci-dessus), puis définir les caractéristiques et les fonctionnalités de chacun d'eux..
Ce composant contiendra les pièces suivantes:
Ce composant affichera des informations de base sur la piste en cours de lecture:
Ce composant contiendra deux barres, qui comprendront toutes les commandes nécessaires pour manipuler les pistes audio de la liste de lecture du lecteur..
Ce composant contiendra la liste de lecture des pistes avec les fonctionnalités suivantes:
Ce composant offrira une fonctionnalité de recherche dans les cas où nous voulons trouver et lire des pistes particulières..
Bien entendu, le contour ci-dessus ne peut couvrir tous les détails et toutes les nuances, et cela convient parfaitement. Pour le moment, il nous suffit d’avoir une vue d’ensemble du produit final. Nous nous occuperons de tous les détails et des éventuels défis pendant le processus de construction.
Entrons donc dans la partie amusante et écrivons du code!
La page de démarrage rapide de Vuetify offre de nombreuses options pour vous aider à démarrer. Nous allons utiliser l'un des modèles CLI Vue prédéfinis appelé Webpack Simple. Exécutez les commandes suivantes dans le répertoire que vous souhaitez utiliser pour ce projet:
Tout d'abord, installez Vue CLI:
$ npm install -g vue-cli
Ensuite, créez l'application:
$ vue init vuetifyjs / webpack-simple vue-music-player
Ensuite, allez dans le répertoire de l'application et installez toutes les dépendances:
$ cd vue-music player $ npm installer
Nous utiliserons Howler.js (une bibliothèque audio JavaScript) pour gérer les parties audio du lecteur de musique. Nous devons donc l'inclure également dans le projet. Exécutez la commande suivante:
$ npm install --save hurleur
Et enfin, lancez l'application:
$ npm run dev
L'application s'ouvrira sur localhost: 8080
dans votre navigateur par défaut. Vous devriez voir un simple squelette de l'application Vuetify.
Pour l'adapter à nos besoins, nous devons nettoyer le modèle et le peaufiner un peu. Renommer le App.vue déposer dans Player.vue, ouvrez-le, supprimez tout ce qu'il contient et ajoutez ce qui suit:
Nous enveloppons notre application de lecteur de musique dans le v-app
composant requis pour le bon fonctionnement de l'application. Nous passons aussi le foncé
prop, pour appliquer le thème sombre Vuetify.
Maintenant, ouvrez le main.js fichier, supprimez le contenu d'origine et ajoutez les éléments suivants:
importer Vue depuis 'vue' importer Vuetify depuis 'vuetify' importer 'vuetify / dist / vuetify.css' importer Player depuis './Player.vue' importer Howl, Howler depuis 'hurler' Vue.use (Vuetify) nouveau Vue (el: '#app', rendu: h => h (Player))
Aussi, ouvrez le index.html déposer et changer le contenu de la
tag à Lecteur de musique Vue.
Maintenant, dans votre navigateur, vous devriez voir une page sombre et vide. Et voila. Vous êtes prêt à commencer à créer.
Avant de commencer à coder, il est bon de savoir que Vuetify propose des extraits de code et l'auto-complétion pour les principaux éditeurs de code: VS Code, Atom et Sublime. Pour obtenir les extraits, recherchez l'extension dans votre éditeur favori (vuetify-vscode
, ou vuetify-atom
, ou vuetify-sublime
).
dans le src répertoire, créer un nouveau Composants dossier. Ensuite, dans ce dossier, créez le PlayerTitleBar.vue fichier avec le contenu suivant:
casque MENUSur Lecteur de musique Vue
Version 1.0.0 D'accord VUE MUSIC PLAYER retirer check_box_outline_blank Fermer
Ici, nous utilisons les composants Vuetify suivants: barre d’outils, menu, bouton, icône, liste, boîte de dialogue et carte.
Nous séparons le menu, le nom et les icônes avec le
composant. Pour afficher ou masquer le dialogue, nous créons le dialogue: faux
propriété de données. Sa valeur va basculer quand on clique sur le bouton Sur élément du menu.
Maintenant, dans le Player.vue fichier, importez le composant de la barre de titre, enregistrez-le dans l'objet composants et ajoutez-le dans le modèle.
// AJOUTER le composant dans le modèle
Maintenant, vérifiez le résultat dans votre navigateur. Vous devriez voir ce qui suit:
Nous allons répéter ces trois étapes pour les quatre autres composants. Ainsi, lorsque je vous demande d'importer, d'enregistrer et d'ajouter un composant dans le modèle dans les sections suivantes, vous devez suivre la même procédure que celle décrite ici..
Dans le répertoire racine, créez un nouveau playlist dossier et ajoutez les fichiers audio que vous souhaitez lire. Les noms de fichiers doivent être écrits avec des traits de soulignement entre les mots et un .mp3 extension à la fin, par exemple, Remember_the_Way.mp3. Maintenant, créez un tableau de pistes audio à l'intérieur Player.vueL'objet de données de:
playlist: [titre: "Streets of Sant'Ivo", artiste: "Ask Again", hurlement: null, display: true, titre: "Remember the Way", artiste: "demander à nouveau", hurlement: null, display: true,…]
Chaque piste a Titre
et artiste
propriétés, un hurler
objet mis à nul
, et un afficher
propriété définie sur vrai
.
le afficher
Cette propriété sera utilisée lors de la mise en œuvre de la fonctionnalité de recherche. Maintenant, il est réglé sur vrai
pour toutes les pistes, donc toutes sont visibles.
Howler enveloppe un fichier audio dans un hurler
objet. Nous fixons hurler
à nul
parce que nous le peuplerons dynamiquement lors de la création de l'instance Vue. Pour ce faire, nous utilisons les Vue créé
crochet de cycle de vie.
created: function () this.playlist.forEach ((track) => let fichier = track.title.replace (/ \ s / g, "_") track.howl = nouveau Howl (src: ['. /playlist/$file.mp3 ']))
Cela établira une nouvelle Hurler
objet pour chaque piste de la playlist.
Maintenant, créez le PlayerPlaylistPanel.vue composant et ajouter ceci à l'intérieur:
index track.artist - track.title track.howl.duration ()
Tout d'abord, nous passons l'accessoire playlist
du Player.vue fichier. Ensuite, dans le modèle, nous parcourons chaque piste avec le v-pour
directive et affichez l’indice de la piste, suivi de l’artiste et du titre de la piste, ainsi que la durée de la piste à l’extrême droite. Nous utilisons aussi v-show
lié à la afficher
propriété. Une piste ne sera visible que si afficher
est vrai
.
Maintenant, dans le Player.vue fichier, nous importons, enregistrons et ajoutons le composant playlist dans le modèle. Ensuite, nous lions le playlist
appui au playlist
propriété de données comme ceci:
.
Vérifions le résultat dans le navigateur:
Ici, nous avons deux problèmes. Premièrement, les numéros des pistes ne sont pas corrects et deuxièmement, la durée de la piste est affichée en millisecondes, mais nous voulons que ce soit en minutes. Nous allons résoudre chacun de ces problèmes en créant un filtre de formatage.
dans le main.js déposer, créer un Nombres
filtre et un minutes
filtre, qui sera globalement accessible. Ensuite, dans PlayerPlaylistPanel.vue, nous les utilisons comme ceci: index | Nombres
et track.howl.duration () | minutes
.
Maintenant, si vous vérifiez l'application, tout devrait s'afficher correctement.
dans le Player.vue fichier, ajoutez le selectedTrack: null
data et le lier au composant playlist (: selectedTrack = "selectedTrack"
). Ensuite, nous passons l'accessoire dans le PlayerPlaylistPanel.vue fichier (selectedTrack: Object
).
Nous ajoutons également un écouteur d’événement click à
puis créer le selectTrack ()
méthode:
méthodes: selectTrack (piste) this. $ emit ('selecttrack', piste)
De retour dans Player.vue
, ajouter le selecttrack
événement au composant playlist (@ selecttrack = "selectTrack"
) et créer le selectTrack ()
méthode:
selectTrack (piste) this.selectedTrack = piste
Maintenant, si vous allez à la playlist et cliquez sur une piste, celle-ci sera sélectionnée. Nous ne pouvons pas le voir, mais nous pouvons le prouver dans Vue DevTools. Dans la capture d'écran suivante, la deuxième piste est sélectionnée:
L'étape suivante consiste à rendre la sélection visible. Pour ce faire, nous allons lier une classe qui colorera la piste sélectionnée en orange et une autre classe qui assombrira les lignes pour rendre les pistes plus visibles. Mettez ce qui suit après le v-show
directif:
: class = "[selected: track === selectedTrack, even: index% 2 == 0]"
Nous ajouterons également une autre classe, qui affichera une barre de défilement lorsque la liste devient trop longue..
Nous ajoutons les classes nécessaires à la fin du fichier.
Et c'est tout. Maintenant, la piste sélectionnée est surlignée en orange.
Nous ajouterons la fonctionnalité de double-clic à la fin de la section suivante..
Créons maintenant les contrôles du joueur. Nous allons commencer par les boutons play, pause et stop.
Créer le PlayerControlsBars.vue composant et ajouter ceci à l'intérieur:
Arrêtez play_arrow pause
Ici, nous utilisons le composant Vuetify de la barre d’outils.
Il y a trois boutons avec des écouteurs d’événement de clic enregistrés. Créons les méthodes pour eux:
méthodes: playTrack (index) this. $ emit ('playtrack', index), pauseTrack () this. $ emit ('pausetrack'), stopTrack () this. $ emit ('stoptrack')
Maintenant, dans le Player.vue fichier, importer, enregistrer et ajouter le composant dans le modèle. Ensuite, enregistrez les écouteurs d'événement (@ playtrack = "play"
, @ pausetrack = "pause"
, @ stoptrack = "stop"
).
Ensuite, créez le indice: 0
propriété de données, qui tiendra l'index de la piste en cours. Ensuite, créez un calcul currentTrack ()
:
calculé: currentTrack () return this.playlist [this.index]
Et maintenant, nous pouvons commencer à créer le jouer
, pause
, et Arrêtez
méthodes. Nous allons commencer avec le jouer()
méthode, mais avant cela, nous devons créer le jouer: faux
data, qui indiquera si la piste est en cours de lecture ou non. Ajoutez le code suivant pour le jouer()
méthode:
play (index) let selectedTrackIndex = this.playlist.findIndex (track => track === this.selectedTrack) if (typeof index === 'nombre') index = index sinon 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 ()) retour else track.play () this.selectedTrack = this.playlist [index] this.playing = true this.index = index
La méthode prend comme paramètre un index qui spécifie la piste à lire. Tout d'abord, nous obtenons l'index de la piste sélectionnée. Ensuite, nous faisons quelques vérifications pour déterminer la valeur du indice
. Si un index est fourni sous forme d'argument et qu'il s'agit d'un nombre, nous l'utilisons. Si une piste est sélectionnée, nous utilisons l'index de la piste sélectionnée. Si la piste sélectionnée est différente de la piste actuelle, nous utilisons le Arrêtez()
méthode pour arrêter le courant. Enfin, si ni un argument d’index n’est passé ni une piste sélectionnée, nous utilisons la valeur de indice
propriété de données.
Ensuite, nous obtenons le hurlement (basé sur la valeur d'index) de la piste et vérifions s'il est en cours de lecture. Si c'est le cas, nous ne retournons rien; si ce n'est pas le cas, on y joue.
Enfin, nous mettons à jour le selectedTrack
, en jouant
et indice
propriétés de données.
Créons maintenant le pause()
et Arrêtez()
les méthodes.
pause () this.currentTrack.howl.pause () this.playing = false, stop () this.currentTrack.howl.stop () this.playing = false
Ici, nous mettons en pause ou arrêtons la piste en cours et mettons à jour le en jouant
propriété de données.
Faisons également en sorte que la piste commence à jouer en double-clic.
Ajouter @ dblclick = "playTrack ()"
à
dans le PlayerPlaylistPanel.vue et créer le playTrack ()
méthode:
playTrack (index) this. $ emit ('playtrack', index)
Enregistrer l'auditeur @ playtrack = "play"
dans le Player.vue déposer et le tour est joué.
Ajoutons maintenant les boutons précédent et suivant.
skip_previous passez au suivant
Créer le skipTrack ()
méthode:
skipTrack (direction) this. $ emit ('skiptrack', direction)
Enregistrer l'écouteur d'événement (@ skiptrack = "skip"
) dans Player.vue.
Et créer le sauter()
méthode:
skip (direction) let index = 0 if (direction === "next") index = this.index + 1 if (index> = this.playlist.length) index = 0 else index = this. index - 1 if (index < 0) index = this.playlist.length - 1 this.skipTo(index) , skipTo (index) if (this.currentTrack) this.currentTrack.howl.stop() this.play(index)
Nous vérifions d’abord si la direction est suivant
. Si c'est le cas, nous incrémentons l'index de 1. Et si l'index devient plus grand que le dernier index du tableau, nous recommençons à zéro. Quand la direction est prev
, nous décrémentons l'index de 1. Et si l'index est inférieur à zéro, nous utilisons le dernier index. À la fin, nous utilisons le indice
comme argument pour la passer()
méthode. Il arrête la piste en cours et lit la lecture suivante ou précédente..
Voici à quoi ressemble le joueur avec les boutons:
Ajoutez ce qui suit avant tous les boutons:
Ici, nous utilisons le composant curseur Vuetify.
Ajouter le volume: 0.5
propriété de données, puis créer le updateVolume ()
méthode:
updateVolume (volume) Howler.volume (volume)
Ici, nous utilisons l'objet global Howler pour définir le volume globalement pour tous les hurlements..
En outre, nous devons synchroniser le volume initial Howler, qui est défini par défaut sur 1, sur le le volume
propriété. Si vous ne le faites pas, le volume indiquera 0,5 mais sera initialement de 1. Pour ce faire, nous allons utiliser le créé
accrocher à nouveau:
créé: function () Howler.volume (this.volume)
Nous voulons voir le niveau de volume sous forme de pourcentage à droite du curseur de volume, nous l'ajoutons donc dans le modèle: this.volume * 100 + '%'
Maintenant, nous ajoutons une icône de volume avant le curseur.
volume_up volume_down volume_mute volume_off
L'icône changera en fonction des valeurs du le volume
et en sourdine
Propriétés.
Ajouter le en sourdine: faux
propriété de données et créer le toggleMute ()
méthode:
toggleMute () Howler.mute (! this.muted) this.muted =! this.muted
Nous utilisons à nouveau l'objet global Howler pour définir le muet globalement, puis nous basculons la en sourdine
valeur.
Dans la capture d'écran ci-dessous, vous pouvez voir à quoi le curseur de volume devrait ressembler:
Ajoutez ce qui suit après tous les boutons:
repeat_one repeat_one
Ajouter le boucle: faux
propriété dans Player.vue, lie le : boucle = "boucle"
et passez le pilier (boucle: booléenne
) dans PlayerControlsBars.vue.
Maintenant, créons le toggleLoop ()
méthode:
toggleLoop () this. $ emit ('toggleloop',! this.loop)
De retour dans Player.vue, enregistrer l'écouteur d'événement (@ toggleloop = "toggleLoop"
) et créer le toggleLoop ()
méthode:
toggleLoop (valeur) this.loop = valeur
À ce stade, nous sommes confrontés à un petit problème. Quand une piste cherche la fin, elle s'arrête. Le lecteur ne passe pas à la piste suivante et ne répète pas la piste en cours. Pour résoudre ce problème, nous devons ajouter ce qui suit à la créé
fonction après la src
propriété:
onend: () => if (this.loop) this.play (this.index) else this.skip ('next')
Maintenant, quand le boucle
est activé, la piste en cours sera répétée. S'il est désactivé, le joueur passera sur la piste suivante..
Ajoutez ce qui suit après le bouton de répétition:
mélanger mélanger
Ajouter le mélanger: faux
propriété dans Player.vue
, le lier (: shuffle = "shuffle"
) et passez le pilier (shuffle: Boolean
) dans PlayerControlsBars.vue
.
Maintenant, créons le toggleShuffle ()
méthode;
toggleShuffle () this. $ emit ('toggleshuffle',! this.shuffle)
De retour dans Player.vue, enregistrer l'écouteur d'événement (@ toggleshuffle = "toggleShuffle"
) et créer le toggleShuffle ()
méthode:
toggleShuffle (valeur) this.shuffle = valeur
Maintenant, ajoutez ce qui suit au sauter()
méthode après indice = 0
:
lastIndex = this.playlist.length - 1 if (this.shuffle) index = Math.round (Math.random () * lastIndex) tandis que (index === this.index) index = Math.round (Math.random () * lastIndex) else if (direction === "suivant") …
Voici à quoi votre application devrait ressembler maintenant:
Premier arrivé Player.vue, créer le chercher: 0
propriété. Ensuite, nous devrons regarder le en jouant
propriété afin de mettre à jour la recherche.
regarder: jouer (jouer) this.seek = this.currentTrack.howl.seek () laisser updateSeek si (jouer) updateSeek = setInterval (() => this.seek = this.currentTrack.howl.seek () , 250) else clearInterval (updateSeek),
Ceci mettra à jour la valeur de recherche quatre fois par seconde.
Maintenant, créez un calcul le progrès()
:
progress () if (this.currentTrack.howl.duration () === 0) renvoie 0 renvoie this.seek / this.currentTrack.howl.duration ()
Liez-le (: progress = "progress"
) dans le modèle.
Maintenant en PlayerControlsBars.vue, passe le le progrès
prop (progrès: nombre
) et ajoutez une autre barre d’outils en dessous de celle que nous avons déjà créée:
Ici, nous utilisons le composant Vuetify Progress.
Créer un calcul suivre le progrès()
, qui obtiendra la progression de la piste en pourcentage.
calculé: trackProgress () return this.progress * 100,
Et maintenant, créez le updateSeek ()
méthode:
updateSeek (event) let el = document.querySelector (". progress-linear__bar"), mousePos = event.offsetX, elWidth = el.clientWidth, percents = (mousePos / elWidth) * 100 this. $ emit ('updateseek', pourcentages
Ici, nous obtenons l’élément barre de progression, qui utilise le .progress-linear__bar
classe. J'ai trouvé cela avec le navigateur DevTools. Ensuite, nous obtenons la position de la souris et la largeur de la barre. Ensuite, nous obtenons la position du clic de souris en pourcentage.
Retour dans Player.vue, ajoutez et enregistrez l'écouteur d'événement (@ updateseek = "setSeek"
) et créer le setSeek ()
méthode:
setSeek (pourcentages) let track = this.currentTrack.howl if (track.playing ()) track.seek ((track.duration () / 100) * pourcent)
Et boum! Vous pouvez utiliser votre souris pour changer la position de la piste lue.
Créer le PlayerInfoPanel.vue fichier avec le contenu suivant:
trackInfo.artist - trackInfo.title
trackInfo.seek | minutes / trackInfo.duration | minutes
Ici, nous passons un accessoire trackInfo
, que nous utilisons pour renseigner les informations de piste dans notre composant.
De retour dans Player.vue, importer, enregistrer et ajouter le composant dans le modèle.
Ensuite, créez un calcul getTrackInfo ()
:
getTrackInfo () let artiste = this.currentTrack.artist, title = this.currentTrack.title, seek = this.seek, duration = this.currentTrack.howl.duration () retourne artiste, titre, cherche, durée
Ensuite, nous le lions dans le template (: trackInfo = "getTrackInfo"
) et le tour est joué. Nous obtenons des informations de base sur la piste en cours de lecture, comme vous pouvez le voir sur la capture d'écran ci-dessous..
Créer le PlayerSearchBar.vue fichier avec le contenu suivant:
Nous créons un champ de texte et ajoutons le effaçable
prop à montrer une icône de compensation lorsque nous tapons quelque chose.
En utilisant modèle v
, nous le lions au searchString
, qui est une chaîne vide au début. Et nous ajoutons un écouteur d'événement d'entrée.
Nous passons aussi le playlist
prop, que nous utilisons dans le searchPlaylist ()
méthode. Dans cette méthode, nous utilisons le afficher
propriété et le tourner de
pour chaque piste dont le titre ou l'artiste ne correspond pas à la chaîne de recherche, et nous la conservons ou la transformons sur
pour tous les matches. Enfin, si la chaîne de recherche est vide ou égale à nul
, ce qui arrive quand on efface le champ avec le bouton clear, on tourne sur
la afficher
pour toutes les pistes.
De retour dans Player.vue, importer, enregistrer et ajouter le composant dans le modèle.
Lier la propriété playlist (: playlist = "playlist"
) et vérifiez la fonctionnalité. Voici à quoi cela devrait ressembler en action:
Comme vous pouvez le constater, avec un objectif clair et une planification appropriée, la création d'une application Vue / Vuetify peut être très simple et agréable. Vous disposez maintenant d'un lecteur de musique que vous pouvez utiliser pendant votre temps de relaxation ou de codage. Bien sûr, il y a toujours place pour d'autres améliorations et ajouts. Voici donc quelques idées que vous pouvez essayer pour rendre le lecteur encore plus riche en fonctionnalités: