Apps bouwen met Vue.js is gemakkelijk, leuk en plezierig. Je kunt een werkende app met minimale inspanning bouwen. Om dat te bewijzen, laat ik je vandaag zien hoe eenvoudig het is om je eigen complete muziekspeler te bouwen. Om het nog gemakkelijker te maken, gebruiken we Vuetify.js, een door Vue.js aangedreven UI-bibliotheek, die de UI-constructie versnelt. Ik kan bijna je ongeduld voelen, dus laten we beginnen.
Je vindt de volledige broncode in de GitHub-repo. En hier is de werkende demo. Als u deze zelfstudie wilt volgen, moet u bekend zijn met Vue-componenten, Vue-componenten voor afzonderlijke bestanden en ES2015-syntaxis.
Elke creatie begint met een idee en op zijn minst wat basisplanning. Dus eerst moeten we beslissen wat we willen bouwen en welke functionaliteit we willen implementeren. Er wordt gezegd dat een foto meer zegt dan duizend woorden, dus laten we beginnen met een eenvoudige schets van de muziekspeler.
Ik heb dit draadframe gemaakt, zodat je een algemeen beeld krijgt van de gebruikersinterface die we willen bouwen. De volgende stap is het beschrijven van de functionaliteit die we willen implementeren.
Zoals John Johnson zegt:
Los eerst het probleem op. Schrijf vervolgens de code.
We gebruiken dat als een bron van wijsheid en we plannen de app voordat we hem gaan coderen.
Vue.js is een op componenten gebaseerd raamwerk. We moeten dus eerst de app splitsen in afzonderlijke componenten (vijf in ons geval, zoals weergegeven in de bovenstaande schets) en de functies en functionaliteit voor elk daarvan schetsen.
Dit onderdeel bevat de volgende onderdelen:
Dit onderdeel toont basisinformatie over het momenteel afgespeelde nummer:
Dit onderdeel bevat twee balken, die alle bedieningselementen bevatten die nodig zijn om de audiotracks in de afspeellijst van de speler te bewerken.
Dit onderdeel bevat de afspeellijst van de tracks met de volgende functionaliteit:
Dit onderdeel biedt zoekfunctionaliteit in de gevallen waarin we bepaalde track (s) willen vinden en afspelen.
Natuurlijk kan de bovenstaande schets niet alle details en nuances behandelen, en dit is prima. Voor nu is het genoeg voor ons om een algemeen beeld te krijgen van het eindproduct. We zullen omgaan met alle details en eventuele uitdagingen tijdens het bouwproces.
Dus laten we in het leuke gedeelte stappen en wat code schrijven!
De snelle startpagina van Vuetify biedt tal van opties om u op weg te helpen. We gebruiken een van de vooraf gemaakte Vue CLI-sjablonen, Webpack Simple genaamd. Voer de volgende opdrachten uit in de map die u voor dit project wilt gebruiken:
Installeer eerst Vue CLI:
$ npm install -g vue-cli
Maak vervolgens de app:
$ vue init vuetifyjs / webpack-simple vue-music-player
Ga vervolgens naar de directory van de app en installeer alle afhankelijkheden:
$ cd vue-music player $ npm installatie
We gebruiken Howler.js (een JavaScript-audiobibliotheek) om de audiogedeelten van de muziekspeler te verwerken. Dus we moeten het ook in het project opnemen. Voer de volgende opdracht uit:
$ npm install - red howler
En ten slotte, voer de app uit:
$ npm voer dev uit
De app wordt geopend localhost: 8080
in je standaardbrowser. Je zou een eenvoudig Vuetify app-skelet moeten zien.
Om het aan te passen aan onze behoeften, moeten we de sjabloon opschonen en een beetje aanpassen. Hernoem de App.vue bestand naar Player.vue, open het, verwijder alles van binnen, en voeg in plaats daarvan het volgende toe:
We verpakken onze muziekspeler-app in de v-app
component, die nodig is om de app correct te laten werken. We passeren ook de donker
prop, om het donkere thema van Vuetify toe te passen.
Open nu de main.js bestand, verwijder de originele inhoud en voeg het volgende toe:
import Vue van 'vue' import Vuetify van 'vuetify' import 'vuetify / dist / vuetify.css' import Speler van './Player.vue' import Howl, Howler van 'howler' Vue.use (Vuetify) nieuwe Vue (el: '#app', render: h => h (Player))
Open ook de index.html bestand en verander de inhoud van de
tag aan Vue muziekspeler.
Nu zou je in je browser een lege donkere pagina moeten zien. En voila. U bent klaar om te beginnen met creëren.
Voordat u begint met coderen, is het goed om te weten dat Vuetify codefragmenten en automatische aanvullingen biedt voor de belangrijkste codebewerkers: VS Code, Atom en Sublime. Zoek naar de extensie in uw favoriete editor om de fragmenten op te halen (vuetify-vscode
, of vuetify-atoom
, of vuetify-sublieme
).
In de src map, maak een nieuwe aan componenten map. Maak vervolgens in die map de PlayerTitleBar.vue bestand met de volgende inhoud:
koptelefoon MENUWat betreft Vue muziekspeler
Versie 1.0.0 OK VUE MUSIC PLAYER verwijderen check_box_outline_blank dichtbij
Hier gebruiken we de volgende Vuetify-componenten: werkbalk, menu, knop, pictogram, lijst, dialoogvenster en kaart.
We scheiden het menu, de naam en de pictogrammen met de
component. Om het dialoogvenster weer te geven of te verbergen, maken we het dialoogvenster: false
data-eigenschap. De waarde zal wisselen als we op klikken Wat betreft menu onderdeel.
Nu, in de Player.vue bestand, importeer de titelbalkcomponent, registreer deze in het componentenobject en voeg deze toe aan de sjabloon.
// VOEG het onderdeel toe aan de sjabloon
Controleer nu het resultaat in uw browser. Je zou het volgende moeten zien:
We herhalen deze drie stappen voor de andere vier componenten. Dus als ik in de volgende secties zeg dat u een onderdeel in de sjabloon moet importeren, registreren en toevoegen, moet u dezelfde procedure volgen die hier wordt beschreven.
Maak een nieuwe in de hoofdmap afspeellijst map en voeg de audiobestanden toe die u wilt afspelen. De bestandsnamen moeten met underscores worden geschreven tussen de woorden en a .mp3 extensie aan het einde, bijvoorbeeld, Remember_the_Way.mp3. Maak nu een reeks audionummers aan de binnenkant Player.vuegegevensobject:
playlist: [title: "Streets of Sant'Ivo", artiest: "Ask Again", howl: null, display: true, title: "Remember the Way", artiest: "Ask Again", howl: null, weergave: true, ...]
Elke track heeft titel
en artiest
eigenschappen, a gehuil
object ingesteld op nul
, en een tonen
eigenschap ingesteld op waar
.
De tonen
property wordt gebruikt wanneer we de zoekfunctionaliteit implementeren. Nu is het ingesteld op waar
voor alle nummers, dus ze zijn allemaal zichtbaar.
Howler verpakt een audiobestand in een gehuil
voorwerp. We gaan zitten gehuil
naar nul
omdat we het dynamisch vullen bij het maken van de Vue-instantie. Om dat te doen, gebruiken we de Vue's aangemaakt
levenscyclus haak.
gemaakt: function () this.playlist.forEach ((track) => let file = track.title.replace (/ \ s / g, "_") track.howl = new Howl (src: ['. /playlist/$file.mp3 ']))
Hiermee wordt een nieuw ingesteld Gehuil
object voor elke track in de afspeellijst.
Maak nu het PlayerPlaylistPanel.vue component en voeg dit toe binnen:
index track.artist - track.title track.howl.duration ()
Eerst passeren we de prop afspeellijst
van de Player.vue het dossier. Vervolgens gaan we in de sjabloon door elke track met de v-for
richtlijn en toon de index van de track, gevolgd door de artiest en de titel van de track en de duur van de track helemaal rechts. We gebruiken ook v-toon
gebonden aan de tonen
eigendom. Een nummer is alleen zichtbaar als tonen
is waar
.
Nu, in de Player.vue bestand, we importeren, registreren en voegen de afspeellijstcomponent toe aan de sjabloon. Vervolgens binden we de afspeellijst
steun aan de afspeellijst
data-eigenschap als deze:
.
Laten we het resultaat in de browser controleren:
Er zijn hier twee problemen. Ten eerste zijn de nummers van de tracks niet correct en ten tweede wordt de duur van het nummer weergegeven in milliseconden, maar we willen dat het nummer in minuten is. We lossen elk van deze problemen op door een opmaakfilter te maken.
In de main.js bestand, maak een getallen
filter en a notulen
filter, die wereldwijd toegankelijk is. Volgende, in PlayerPlaylistPanel.vue, we gebruiken ze als volgt: index | nummers
en track.howl.duration () | minuten
.
Als u de app nu aanvinkt, zou alles correct moeten worden weergegeven.
In de Player.vue bestand, voeg de selectedTrack: null
data-eigenschap en bind deze aan de afspeellijstcomponent (: SelectedTrack = "selectedTrack"
). Vervolgens passeren we de prop in de PlayerPlaylistPanel.vue het dossier (selectedTrack: Object
).
We voegen ook een klikgebeurtenislistener toe aan
en maak vervolgens de selectTrack ()
methode:
methoden: selectTrack (track) this. $ emit ('selecttrack', track)
Nu weer terug Player.vue
, voeg het toe selecttrack
evenement voor de afspeellijstcomponent (@ Selecttrack = "selectTrack"
) en maak de selectTrack ()
methode:
selectTrack (track) this.selectedTrack = track
Als u nu naar de afspeellijst gaat en op een nummer klikt, wordt deze geselecteerd. We kunnen het niet zien, maar we kunnen het bewijzen in de Vue DevTools. In de volgende schermafbeelding is de tweede track geselecteerd:
De volgende stap is om de selectie zichtbaar te maken. Om dit te doen, binden we een klasse die de geselecteerde track in oranje kleurt en een andere klasse die zelfs rijen donkerder maakt om de tracks beter te onderscheiden. Zet het volgende na de v-toon
richtlijn:
: class = "[selected: track === selectedTrack, even: index% 2 == 0]"
We voegen ook nog een klas toe, die een schuifbalk laat zien als de lijst te groot wordt.
We voegen de nodige klassen toe aan het einde van het bestand.
En dat is het. Het geselecteerde nummer is nu oranje gemarkeerd.
Aan het einde van het volgende gedeelte voegen we de afspeelfunctionaliteit voor dubbelklikken toe.
Laten we nu de bedieningselementen van de speler maken. We beginnen met de knoppen Afspelen, Pauzeren en Stoppen.
Maak het PlayerControlsBars.vue component en voeg dit toe binnen:
hou op play_arrow pauze
Hier gebruiken we de Vuetify-werkbalkcomponent.
Er zijn drie knoppen met geregistreerde klikgebeurtenislisteners. Laten we de methoden voor hen maken:
methoden: playTrack (index) this. $ emit ('playtrack', index), pauseTrack () this. $ emit ('pausetrack'), stopTrack () this. $ emit ('stoptrack')
Nu, in de Player.vue bestand, importeer, registreer en voeg de component toe aan de sjabloon. Registreer vervolgens de gebeurtenislisteners (@ PlayTrack = "spelen"
, @ Pausetrack = "pause"
, @ StopTrack = "stop"
).
Maak vervolgens de index: 0
data-eigenschap, die de index van de huidige track zal bevatten. Maak vervolgens een berekende currentTrack ()
:
berekend: currentTrack () retourneer deze.playlist [this.index]
En nu kunnen we beginnen met het maken van de spelen
, pauze
, en hou op
methoden. We beginnen met de spelen()
methode, maar daarvoor moeten we het maken spelen: false
data-eigenschap, die aangeeft of de track wordt afgespeeld of niet. Voeg de volgende code toe voor de spelen()
methode:
play (index) let 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 ()) ga terug else track.play () this.selectedTrack = this.playlist [index] this.playing = true this.index = index
De methode neemt een index als de parameter, die het nummer aangeeft dat moet worden afgespeeld. Eerst krijgen we de index van de geselecteerde track. Vervolgens voeren we enkele controles uit om de waarde van de te bepalen inhoudsopgave
. Als een index wordt verstrekt als een argument en het een getal is, gebruiken we het. Als een nummer is geselecteerd, gebruiken we de index van het geselecteerde nummer. Als de geselecteerde track anders is dan de huidige, gebruiken we de hou op()
methode om de huidige te stoppen. Als ten slotte een indexargument niet is doorgegeven of een track is geselecteerd, gebruiken we de waarde van de inhoudsopgave
data-eigenschap.
Vervolgens krijgen we het gehuil (op basis van de indexwaarde) voor de track en controleren of het speelt. Als dat zo is, keren we niets terug; als dat niet zo is, spelen we het.
Ten slotte werken we het selectedTrack
, spelen
en inhoudsopgave
data eigenschappen.
Laten we nu het maken pauze()
en hou op()
methoden.
pause () this.currentTrack.howl.pause () this.playing = false, stop () this.currentTrack.howl.stop () this.playing = false
Hier pauzeren of stoppen we het huidige nummer en werken we het spelen
data-eigenschap.
Laten we ook een nummer beginnen te spelen met dubbelklikken.
Toevoegen @ DblClick = "PlayTrack ()"
naar
in de PlayerPlaylistPanel.vue en maak de PlayTrack ()
methode:
playTrack (index) this. $ emit ('playtrack', index)
Registreer de luisteraar @ PlayTrack = "spelen"
in de Player.vue bestand en voila.
Laten we nu de vorige en volgende knoppen toevoegen.
skip_previous skip_next
Maak het skipTrack ()
methode:
skipTrack (richting) this. $ emit ('skiptrack', richting)
Registreer de gebeurtenislistener (@ Skiptrack = "skip"
) in Player.vue.
En maak de overspringen()
methode:
skip (richting) 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)
We controleren eerst of de richting is volgende
. Als dit het geval is, verhogen we de index met 1. En als de index groter wordt dan de laatste index in de array, dan beginnen we opnieuw bij nul. Wanneer de richting is prev
, we verlagen de index met 1. En als de index kleiner is dan nul, gebruiken we de laatste index. Aan het eind gebruiken we de inhoudsopgave
als een argument voor de skipto ()
methode. Het stopt de huidige track en speelt de volgende of vorige af.
Hier ziet u hoe de speler eruit ziet met de knoppen:
Voeg het volgende toe vóór alle knoppen:
Hier gebruiken we de schuifcomponent Vuetify.
Voeg de toe volume: 0,5
data eigenschap en maak vervolgens de updateVolume ()
methode:
updateVolume (volume) Howler.volume (volume)
Hier gebruiken we het globale Howler-object om het volume globaal in te stellen voor alle gehuil.
We moeten ook het oorspronkelijke Howler-volume, dat standaard is ingesteld op 1, synchroniseren met de volume
eigendom. Als u dit niet doet, wordt het volume 0,5 weergegeven, maar in eerste instantie 1. Om dat te doen, zullen we de aangemaakt
haak opnieuw:
gemaakt: function () Howler.volume (this.volume)
We willen het volumeniveau zien als een percentage rechts van de volumeregelaar, dus we voegen dit toe aan de sjabloon: this.volume * 100 + '%'
Nu voegen we een volumepictogram toe vóór de schuifregelaar.
volume_up volume_down volume_mute volume_off
Het pictogram zal veranderen volgens de waarden van de volume
en gedempt
eigenschappen.
Voeg de toe gedempt: false
data eigenschap en maak de toggleMute ()
methode:
toggleMute () Howler.mute (! this.muted) this.muted =! this.muted
We gebruiken het globale Howler-object opnieuw om de muting globaal in te stellen, en dan schakelen we de gedempt
waarde.
In de onderstaande schermafbeelding ziet u hoe de volumeregelaar eruit moet zien:
Voeg het volgende toe na alle knoppen:
repeat_one repeat_one
Voeg de toe loop: false
woning in Player.vue, bind het : Loop = "loop"
en passeer de prop (loop: Boolean
) in PlayerControlsBars.vue.
Laten we nu het maken toggleLoop ()
methode:
toggleLoop () this. $ emit ('toggleloop',! this.loop)
Nu weer terug Player.vue, registreer de gebeurtenislistener (@ Toggleloop = "toggleLoop"
) en maak de toggleLoop ()
methode:
toggleLoop (waarde) this.loop = value
Op dit moment hebben we een klein probleempje. Wanneer een nummer het einde zoekt, stopt het gewoon. De speler gaat niet naar de volgende track en herhaalt ook de huidige track niet. Om dit op te lossen, moeten we het volgende toevoegen aan de aangemaakt
functie na de src
eigendom:
onend: () => if (this.loop) this.play (this.index) else this.skip ('next')
Nu, wanneer de lus
is ingeschakeld, wordt het huidige nummer herhaald. Als het uit is, gaat de speler verder met het volgende nummer.
Voeg het volgende toe na de herhaalknop:
schuifelen schuifelen
Voeg de toe shuffle: false
woning in Player.vue
, bind het (: Shuffle = "shuffle"
) en geef de prop door (shuffle: Boolean
) in PlayerControlsBars.vue
.
Laten we nu het maken toggleShuffle ()
methode;
toggleShuffle () this. $ emit ('toggleshuffle',! this.shuffle)
Nu weer terug Player.vue, registreer de gebeurtenislistener (@ Toggleshuffle = "toggleShuffle"
) en maak de toggleShuffle ()
methode:
toggleShuffle (waarde) this.shuffle = waarde
Voeg nu het volgende toe aan de overspringen()
methode na index = 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") ...
Dit is hoe uw app er nu zou moeten uitzien:
Eerst in Player.vue, maak het zoeken: 0
eigendom. Dan zullen we de spelen
eigendom om de zoekactie bij te werken.
bekijk: spelen (spelen) this.seek = this.currentTrack.howl.seek () laat updateSeek if (spelen) updateSeek = setInterval (() => this.seek = this.currentTrack.howl.seek () , 250) else clearInterval (updateSeek),
Hiermee wordt de zoekwaarde vier keer per seconde bijgewerkt.
Maak nu een berekende vooruitgang()
:
progress () if (this.currentTrack.howl.duration () === 0) return 0 retourneer this.seek / this.currentTrack.howl.duration ()
Bind het (: Progress = "vooruitgang"
) in de sjabloon.
Nu in PlayerControlsBars.vue, geef de vooruitgang
prop (voortgang: nummer
) en voeg een andere werkbalk toe onder degene die we al hebben gemaakt:
Hier gebruiken we de Vuetify-voortgangscomponent.
Maak een berekend trackProgress ()
, waarmee de voortgang van het nummer als een percentage wordt weergegeven.
berekend: trackProgress () return this.progress * 100,
En nu, maak de updateSeek ()
methode:
updateSeek (event) let el = document.querySelector (". progress-linear__bar"), mousePos = event.offsetX, elWidth = el.clientWidth, percents = (mousePos / elWidth) * 100 this. $ emit ('updateseek', procenten)
Hier krijgen we het voortgangsbalkelement, dat de .vooruitgang-linear__bar
klasse. Ik vond dit met de browser DevTools. Vervolgens krijgen we de muispositie en de breedte van de balk. Vervolgens krijgen we de muisklikpositie als een percentage.
Terug in Player.vue, toevoegen en registreren van de gebeurtenislistener (@ Updateseek = "setSeek"
) en maak de setSeek ()
methode:
setSeek (procenten) let track = this.currentTrack.howl if (track.playing ()) track.seek ((track.duration () / 100) * procenten)
En boem! U kunt uw muis gebruiken om de positie van de afgespeelde track te wijzigen.
Maak het PlayerInfoPanel.vue bestand met de volgende inhoud:
trackInfo.artist - trackInfo.title
trackInfo.seek | minuten / trackInfo.duration | notulen
Hier passeren we een prop trackinfo
, die we gebruiken om de trackinformatie in onze component te vullen.
Nu weer terug Player.vue, importeer, registreer en voeg het component toe aan de sjabloon.
Maak vervolgens een berekende getTrackInfo ()
:
getTrackInfo () let artist = this.currentTrack.artist, title = this.currentTrack.title, seek = this.seek, duration = this.currentTrack.howl.duration () return artiest, titel, zoek, duur,
Vervolgens binden we het in de sjabloon (: Trackinfo = "getTrackInfo"
) en voila. We krijgen wat basisinformatie voor het momenteel afgespeelde nummer, zoals je kunt zien in de onderstaande schermafbeelding.
Maak het PlayerSearchBar.vue bestand met de volgende inhoud:
We maken een tekstveld en voegen het toe wisbare
steun om een verwijderingspictogram weer te geven wanneer we iets typen.
Door het gebruiken van v-model
, we binden het aan de searchstring
, wat in eerste instantie een lege string is. En we voegen een luisteraar voor invoergebeurtenissen toe.
We passeren ook de afspeellijst
prop, die we gebruiken in de searchPlaylist ()
methode. In deze methode gebruiken we de tonen
eigendom en draai het uit
voor elke track waar de titel of artiest niet overeenkomt met de zoekreeks, en we behouden deze of we draaien hem op
voor alle wedstrijden. Ten slotte, als de zoekreeks leeg of gelijk is aan nul
, wat gebeurt als we het veld leegmaken met de clear-knop, draaien we op
de tonen
voor alle nummers.
Nu weer terug Player.vue, importeer, registreer en voeg het component toe aan de sjabloon.
Bind de eigenschap afspeellijst (: Playlist = "playlist"
) en controleer de functionaliteit. Hier is hoe het er in actie uit zou moeten zien:
Zoals u kunt zien, met een duidelijk doel en een goede planning, kan het bouwen van een Vue / Vuetify-app heel gemakkelijk en plezierig zijn. Je hebt nu een werkende muziekspeler die je kunt gebruiken tijdens je ontspanning of coderingstijd. Natuurlijk is er altijd ruimte voor verdere verbeteringen en toevoegingen, dus hier zijn enkele ideeën die u kunt uitproberen om de speler nog rijker te maken:
In deze zelfstudie hebben we gezien hoe gemakkelijk en plezierig het kan zijn om een app te bouwen met Vue.js en in het bijzonder met Vuetify.js. Ik hoop dat je het leuk vond om deze speler net zo te bouwen als ik. Ik zal blij zijn om je eigen verbeterde versie van de speler te zien. Dus als u er een maakt, kunt u een demokoppeling in de opmerkingen plaatsen!