Construirea de aplicații cu Vue.js este ușoară, distractivă și plăcută. Puteți crea o aplicație de lucru cu un efort minim. Pentru a dovedi asta, astăzi vă voi arăta cât de ușor este să vă construiți propriul player de muzică full-featured. Pentru a face lucrurile mai ușoare, vom folosi Vuetify.js, o bibliotecă UI powered by Vue.js, ceea ce va grăbi construcția UI. Aproape că vă simt nerăbdarea, așa că să începem.
Puteți găsi codul sursă complet în repo GitHub. Și aici este demo-ul de lucru. Pentru a urma acest tutorial, ar trebui să fiți familiarizați cu componentele Vue, componentele fișierului single Vue și sintaxa ES2015.
Fiecare creație începe cu o idee și cel puțin o planificare de bază. Deci, mai întâi trebuie să decidem ce vrem să construim și ce funcționalitate vrem să implementăm. Se spune că o imagine este în valoare de o mie de cuvinte, așa că să începem cu o schiță simplă a music playerului.
Am făcut acest cadru pentru a obține o noțiune generală despre interfața utilizator pe care dorim să o construim. Următorul pas este să descriem funcționalitatea pe care intenționăm să o implementăm.
După cum spune John Johnson:
În primul rând, rezolvați problema. Apoi scrieți codul.
O vom folosi ca pe o sursă de înțelepciune și vom planifica aplicația înainte de a începe să o codificăm.
Vue.js este un cadru bazat pe componente. Așadar, mai întâi trebuie să împărțim aplicația în componente individuale (cinci în cazul nostru, așa cum se arată în schița de mai sus) și să contureze caracteristicile și funcționalitatea fiecăruia.
Această componentă va conține următoarele părți:
Această componentă va afișa informații de bază despre piesa redată curent:
Această componentă va conține două bare, care vor include toate comenzile necesare pentru manipularea pieselor audio din lista de redare a playerului.
Această componentă va conține lista de redare a melodiilor cu următoarele funcționalități:
Această componentă va oferi funcționalitate de căutare în cazurile în care vrem să găsim și să jucăm anumite piese.
Desigur, conturul de mai sus nu poate acoperi toate detaliile și nuanțele, iar acest lucru este perfect. Deocamdată, este suficient să obținem o imagine globală a produsului final. Vom rezolva toate detaliile și eventualele provocări în timpul procesului de construcție.
Deci, hai să intrăm în partea distractivă și să scriem un cod!
Pagina de pornire rapidă a lui Vuetify oferă o mulțime de opțiuni pentru a începe. Vom utiliza unul dintre șabloanele Vue CLI pre-fabricate numite Webpack Simple. Rulați următoarele comenzi în directorul pe care doriți să îl utilizați pentru acest proiect:
Mai întâi, instalați Vue CLI:
$ npm instalare -g vue-cli
Apoi, creați aplicația:
$ vue init vuetifyjs / webpack-simplu vue-music-player
Apoi, mergeți la directorul aplicației și instalați toate dependențele:
$ cd music player $ npm install
Vom folosi Howler.js (o bibliotecă audio JavaScript) pentru a gestiona părțile audio ale playerului muzical. Deci, trebuie să-l includem și în proiect. Rulați următoarea comandă:
$ npm install - salvează
În sfârșit, rulați aplicația:
$ npm run dev
Aplicația se va deschide localhost: 8080
în browserul dvs. implicit. Ar trebui să vedeți un simplu schelet de aplicații Vuetify.
Pentru ao adapta la nevoile noastre, trebuie să curățăm șablonul și să-l optimizăm puțin. Redenumiți App.vue fișier la Player.vue, deschideți-l, ștergeți totul în interior și adăugați în schimb următoarele:
Am înfășurat aplicația noastră de muzică în v-app
care este necesar pentru ca aplicația să funcționeze corect. De asemenea, treceți întuneric
prop, pentru a aplica tema Vuetify întunecată.
Acum, deschideți main.js fișier, ștergeți conținutul original și adăugați următoarele:
import Vue de la importul "vue" Vuetify de la "vuetify" importați importul "vuetify / dist / vuetify.css" importați din importul "./Player.vue" howl, howler Vue.use (Vuetify) (el: '#app', render: h => h (Player))
De asemenea, deschideți index.html fișier și modificați conținutul
eticheta la Vue Music Player.
Acum, în browser-ul dvs., ar trebui să vedeți o pagină neagră goală. Și voila. Sunteți gata să începeți să creați.
Înainte de a începe codarea, este bine de știut că Vuetify oferă fragmente de cod și autocompleție pentru editorii majori de cod: VS Code, Atom și Sublime. Pentru a obține fragmentele, căutați extensia în editorul dvs. preferat (vuetify-vscode
, sau vuetify-atom
, sau vuetify-sublimă
).
În src director, creați un nou componente pliant. Apoi, în acel dosar, creați PlayerTitleBar.vue fișier cu următorul conținut:
căști MENIULDespre Vue Music Player
Versiunea 1.0.0 O.K VUE MUSIC PLAYER elimina check_box_outline_blank închide
Aici folosim următoarele componente Vuetify: bara de instrumente, meniu, buton, pictogramă, listă, dialog și card.
Detinem meniul, numele și pictogramele cu
componentă. Pentru a afișa sau a ascunde dialogul, creăm dialog: fals
proprietatea datelor. Valoarea sa se va schimba atunci când faceți clic pe Despre articol din meniu.
Acum, în Player.vue fișier, importați componenta barei de titlu, înregistrați-o în obiectul componente și adăugați-o în șablon.
// Adăugați componenta în șablon
Acum, verificați rezultatul în browser. Ar trebui să vedeți următoarele:
Vom repeta acești trei pași pentru celelalte patru componente. Deci, atunci când în secțiunile următoare vă spun să importați, să înregistrați și să adăugați o componentă în șablon, trebuie să urmați aceeași procedură descrisă aici.
În directorul rădăcină, creați un nou lista de redare și adăugați fișierele audio pe care doriți să le redați. Numele de fișiere trebuie să fie scrise cu subliniere între cuvintele și a .mp3 extindere la sfârșitul anului - de exemplu, Remember_the_Way.mp3. Acum, creați o matrice de piese audio înăuntru Player.vue's obiect de date:
playlist: [title: "Streets of Sant'Ivo", artist: "Întrebați", urla: null, display: true, title: "Remember the Way" afișare: true, ...]
Fiecare piesă are titlu
și artist
proprietăți, a urla
obiect setat la nul
, și a afişa
proprietate setat la Adevărat
.
afişa
proprietatea va fi utilizată atunci când implementăm funcția de căutare. Acum este setat la Adevărat
pentru toate piesele, astfel încât toate acestea sunt vizibile.
Howler împachetează un fișier audio într - un urla
obiect. Noi am stabilit urla
la nul
deoarece o vom populiza dinamic la crearea instanței Vue. Pentru a face asta, folosim Vue creată
Cârlig de viață.
creat: functie () this.playlist.forEach ((piesa) => let file = track.title.replace (/ \ s / g, "_") track.howl = new Howl (src: ['. /playlist/$file.mp3 ']))
Acest lucru va crea un nou Urla
obiect pentru fiecare piesă din lista de redare.
Acum, creați PlayerPlaylistPanel.vue și adăugați acest lucru în interior:
index track.artist - track.title track.howl.duration ()
În primul rând, noi trecem pe proiecție lista de redare
de la Player.vue fişier. Apoi, în șablon, vom trece prin fiecare piesă cu v-pentru
directivă și afișați indicele piesei, urmat de artistul și titlul piesei, precum și durata piesei de pe extrema dreaptă. De asemenea, folosim v-show
obligat la afişa
proprietate. O piesă va fi vizibilă numai dacă afişa
este Adevărat
.
Acum, în Player.vue fișier, vom importa, înregistra și adăuga componenta playlistului în șablon. Apoi, le legăm lista de redare
propunere la lista de redare
astfel de date:
.
Să verificăm rezultatul în browser:
Există două probleme aici. În primul rând, numărul pieselor nu este corect și, în al doilea rând, durata piesei este afișată în milisecunde, dar vrem să fie în câteva minute. Vom remedia fiecare dintre aceste probleme creând un filtru de formatare.
În main.js fișier, creați un numerele
filtru și a minute
filtru, care va fi accesibil la nivel global. În continuare, în PlayerPlaylistPanel.vue, le folosim astfel: index | numere
și track.howl.duration () | minute
.
Acum, dacă verificați aplicația, totul ar trebui să fie afișat corect.
În Player.vue fișier, adăugați selectatTrack: null
și să o legați de componenta playlistului (: SelectedTrack = "selectedTrack"
). Apoi, trecem proiecția în PlayerPlaylistPanel.vue fișier (selectatTrack: Obiect
).
Adăugăm, de asemenea, un ascultător al evenimentului de clic
și apoi creați selectTrack ()
metodă:
metode: selectTrack (track) this. $ emit ('selecttrack', track)
Acum, înapoi Player.vue
, adaugă selecttrack
la componenta playlist (@ Selecttrack = "selectTrack"
) și creați selectTrack ()
metodă:
selectTrack (melodie) this.selectedTrack = melodie
Acum, dacă accesați playlistul și faceți clic pe o piesă, acesta va fi selectat. Nu o putem vedea, dar o putem dovedi în Vue DevTools. În următorul ecran, este selectată cea de-a doua piesă:
Următorul pas este să faceți vizibilitatea selecției. Pentru a face acest lucru, vom lega o clasă care va colora pista selectată cu portocaliu și o altă clasă, care va face ca rândurile să fie mai întunecate pentru a face piesele mai distincte. Puneți următoarele după v-show
directivă:
: class = "[select: track === selectTrack, even: index% 2 == 0]"
De asemenea, vom adăuga o altă clasă, care va afișa o bară de derulare atunci când lista devine prea mare.
Adăugăm clasele necesare la sfârșitul fișierului.
Si asta e. Acum piesa selectată este evidențiată cu portocaliu.
Vom adăuga funcția de redare cu dublu clic la sfârșitul secțiunii următoare.
Să creăm acum controalele playerului. Vom începe cu butoanele de redare, pauză și oprire.
Creați PlayerControlsBars.vue și adăugați acest lucru în interior:
Stop play_arrow pauză
Aici, vom folosi componenta bara de instrumente Vuetify.
Există trei butoane cu ascultători de evenimente înregistrate pentru clicuri. Să creați metodele pentru ele:
metode: playTrack (index) acest $ emit ('playtrack', index), pauseTrack () this. $ emit ('pausetrack') stopTrack
Acum, în Player.vue fișier, importați, înregistrați și adăugați componenta în șablon. Apoi, înregistrați ascultătorii evenimentului (@ Playtrack = "play"
, @ Pausetrack = "pauză"
, @ Stoptrack = "stop"
).
Apoi, creați index: 0
proprietate de date, care va păstra indicele piesei curente. Apoi, creați un calculat currentTrack ()
:
calculat: currentTrack () return this.playlist [this.index]
Și acum putem începe să creăm Joaca
, pauză
, și Stop
metode. Vom începe cu Joaca()
dar înainte de aceasta avem nevoie să creăm joc: fals
proprietate de date, care va indica dacă piesa se joacă sau nu. Adăugați următorul cod pentru Joaca()
metodă:
play (index) lăsați selectTrackIndex = this.playlist.findIndex (track => track === this.selectedTrack) dacă (typeof index === 'number') index = index altceva dacă (this.selectedTrack) (this.selectedTrack! = this.currentTrack) this.stop () index = selectedTrackIndex altceva index = this.index permite track = this.playlist [index] .howl if (track.playing () altceva track.play () this.selectedTrack = this.playlist [index] this.playing = true this.index = index
Metoda ia un index ca parametru, care specifică piesa care urmează să fie redată. Mai întâi, obținem indicele piesei selectate. Apoi, facem unele verificări pentru a determina valoarea lui index
. Dacă un index este furnizat ca argument și este un număr, atunci îl folosim. Dacă este selectată o pistă, folosim indexul piesei selectate. Dacă piesa selectată este diferită de cea curentă, folosim Stop()
metoda de oprire a celei curente. În cele din urmă, dacă nu este trecut nici un argument index și nici o piesă nu este selectată, vom folosi valoarea lui index
proprietatea datelor.
Apoi, obținem urla (pe baza valorii indexului) pentru piesă și verificăm dacă se redă. Dacă este, nu vom întoarce nimic; dacă nu este, ne jucăm.
În cele din urmă, actualizăm selectedTrack
, joc
și index
proprietăți de date.
Să creați acum pauză()
și Stop()
metode.
pauză () this.currentTrack.howl.pause () this.playing = false, stop () this.currentTrack.howl.stop () this.playing = false
Aici, vom întrerupe sau opri piesa curentă și vom actualiza joc
proprietatea datelor.
Să facem, de asemenea, o pistă începe să joace cu dublu clic.
Adăuga @ Dblclick = "playTrack ()"
la
în PlayerPlaylistPanel.vue și creați playTrack ()
metodă:
playTrack (index) this. $ emit ('playtrack', index)
Înregistrați ascultătorul @ Playtrack = "play"
în Player.vue fișier și voila.
Să adăugăm acum butoanele anterioare și următoare.
skip_previous skip_next
Creați skipTrack ()
metodă:
skipTrack (direcția) this. $ emit ('skiptrack', direcție)
Înregistrați ascultătorul evenimentului (@ Skiptrack = "skip"
) în Player.vue.
Și creați ocolire()
metodă:
(index => this.playlist.length) index = 0 altceva index = acest lucru. index - 1 dacă (index < 0) index = this.playlist.length - 1 this.skipTo(index) , skipTo (index) if (this.currentTrack) this.currentTrack.howl.stop() this.play(index)
Mai întâi verificăm dacă direcția este Următor →
. Dacă da, vom crește indicele cu 1. Și dacă indicele devine mai mare decât ultimul indice din matrice, atunci vom începe din nou de la zero. Când direcția este prev
, noi decrementăm indicele cu 1. Și dacă indicele este mai mic decât zero, vom folosi ultimul indice. În final, folosim index
ca argument pentru sari la()
metodă. Oprește piesa curentă și redă următoarea sau cea anterioară.
Iată cum arată playerul cu butoanele:
Adăugați următoarele înaintea tuturor butoanelor:
Aici folosim componenta glisantă Vuetify.
Adaugă volum: 0,5
data proprietate, și apoi creați updateVolume ()
metodă:
updateVolume (volum) Capacitate volum (volum)
Aici, utilizăm obiectul global Howler pentru a seta volumul la nivel global pentru toate urletele.
De asemenea, trebuie să sincronizăm volumul inițial Howler, care în mod prestabilit este setat la 1, la volum
proprietate. Dacă nu o faceți, volumul va afișa 0,5, dar va fi inițial 1. Pentru a face asta, vom folosi creată
cârlig din nou:
creat: function () Howler.volume (this.volume)
Vrem să vedem nivelul volumului ca procent din partea dreaptă a cursorului de volum, deci adăugăm acest lucru în șablon: acest volum * 100 + '%'
Acum, adăugăm o pictogramă de volum înaintea glisorului.
volume_up volume_down volume_mute volume_off
Pictograma se va schimba în funcție de valorile volum
și dezactivat
proprietăţi.
Adaugă dezactivat: fals
datele de proprietate și de a crea toggleMute ()
metodă:
toggleMute () Howler.mute (! this.muted) this.muted =! this.muted
Utilizăm din nou obiectul global Howler pentru a seta mutele la nivel global, apoi vom comuta dezactivat
valoare.
În captura de ecran de mai jos, puteți vedea cum ar trebui să arate glisorul de volum:
Adăugați următoarele după toate butoanele:
repeat_one repeat_one
Adaugă buclă: falsă
în proprietate Player.vue, obligați-l : Loop = "loop"
și treceți propulsa (buclă: Booleană
) în PlayerControlsBars.vue.
Acum, să creăm toggleLoop ()
metodă:
toggleLoop () acest. $ emit ('toggleloop',! this.loop)
Acum, înapoi Player.vue, înregistrați ascultătorul evenimentului (@ Toggleloop = "toggleLoop"
) și creați toggleLoop ()
metodă:
toggleLoop (valoare) this.loop = valoare
În acest moment, ne confruntăm cu o mică problemă. Când o piesă urmărește sfârșitul, ea se oprește. Playerul nu se mișcă la piesa următoare și nici nu repetă melodia curentă. Pentru a rezolva acest lucru, trebuie să adăugăm următoarele creată
funcție după src
proprietate:
onend: () => if (this.loop) this.play (this.index) altceva this.skip ('next')
Acum, când buclă
este activată, piesa curentă va fi repetată. Dacă este oprit, jucătorul se va muta pe următoarea pistă.
Adăugați următoarele după butonul de repetare:
amesteca amesteca
Adaugă shuffle: false
în proprietate Player.vue
, lega-l (: Shuffle = "shuffle"
), și treceți propulsa (shuffle: Boolean
) în PlayerControlsBars.vue
.
Acum, să creăm toggleShuffle ()
metodă;
toggleShuffle () this. $ emit ('toggleshuffle',! this.shuffle)
Acum, înapoi Player.vue, înregistrați ascultătorul evenimentului (@ Toggleshuffle = "toggleShuffle"
) și creați toggleShuffle ()
metodă:
toggleShuffle (valoare) this.shuffle = valoare
Acum, adăugați următoarele la ocolire()
dupa metoda index = 0
:
lastIndex = this.playlist.length - 1 dacă (this.shuffle) index = Math.round (Math.random () * lastIndex) în timp ce (index === this.index) index = Math.round (Math.random () * lastIndex) altfel dacă (direcția === "următorul") ...
Iată cum arată acum aplicația dvs.:
Primul in Player.vue, creați caută: 0
proprietate. Atunci vom avea nevoie să urmărim joc
proprietate în scopul de a actualiza căuta.
ceas: play (joc) this.seek = this.currentTrack.howl.seek () lasă updateSeek dacă (joc) updateSeek = setInterval (() => this.seek = this.currentTrack.howl.seek , 250) altceva clearInterval (updateSeek),
Aceasta va actualiza valoarea căutării de patru ori pe secundă.
Acum, creați un calculat progres ()
:
progress () if (this.currentTrack.howl.duration () === 0) retur 0 întoarcere this.seek / this.currentTrack.howl.duration ()
Legați-l (: Progres = „progres“
) în șablon.
Acum in PlayerControlsBars.vue, treci progres
prop (progres: Număr
) și adăugați o altă bara de instrumente sub cea pe care am creat-o deja:
Aici folosim componenta de progres Vuetify.
Creați o valoare calculată trackProgress ()
, care va obține progresul piesei ca procent.
calculat: trackProgress () return this.progress * 100,
Și acum, creați updateSeek ()
metodă:
($) $ $ emit ('updateseek', '%', '%', ' procente)
Aici, obținem elementul barei de progres, care utilizează .progres-linear__bar
clasă. Am găsit acest lucru cu browserul DevTools. Apoi, vom obține poziția mouse-ului și lățimea barei. Apoi, vom obține poziția clicului mouse-ului ca procent.
Înapoi în Player.vue, adăugați și înregistrați ascultătorul evenimentului (@ Updateseek = "setSeek"
) și creați setSeek ()
metodă:
setSeek (percente) lăsați track = this.currentTrack.howl dacă (track.playing ()) track.seek ((track.duration () / 100) * percents)
Și boom! Puteți folosi mouse-ul pentru a schimba poziția piesei redate.
Creați PlayerInfoPanel.vue fișier cu următorul conținut:
trackInfo.artist - trackInfo.title
trackInfo.seek | minute / trackInfo.duration | minute
Aici, trecem printr-un suport trackInfo
, pe care le folosim pentru a popula informațiile despre piesă în componenta noastră.
Acum, înapoi Player.vue, import, înregistrați și adăugați componenta în șablon.
Apoi, creați un calculat getTrackInfo ()
:
getTrackInfo () let artist = this.currentTrack.artist, title = acest.currentTrack.title, caută = this.seek, duration = this.currentTrack.howl.duration () întoarce artist, titlu, căuta, durata
În continuare, îl legăm în șablon (: TrackInfo = "getTrackInfo"
) și voila. Avem câteva informații de bază pentru melodia pe care o jucăm în prezent, după cum puteți vedea în imaginea de mai jos.
Creați PlayerSearchBar.vue fișier cu următorul conținut:
Creăm un câmp de text și adăugăm anulabile
propuneți să afișați o pictogramă de ștergere când scrieți ceva.
Prin utilizarea v model
, îl legăm la searchstring
, care este inițial un șir gol. Și adăugăm un ascultător al evenimentului de intrare.
De asemenea, treceți lista de redare
prop, pe care îl folosim în searchPlaylist ()
metodă. În această metodă, folosim afişa
proprietăți și transformați-o de pe
pentru fiecare piesă în care titlul sau artistul nu se potrivește cu șirul de căutare și îl păstrăm sau îl transformăm pe
pentru toate meciurile. În cele din urmă, dacă șirul de căutare este gol sau egal cu nul
, care se întâmplă atunci când ștergem câmpul cu butonul clar, ne întoarcem pe
afişa
pentru toate melodiile.
Acum, înapoi Player.vue, import, înregistrați și adăugați componenta în șablon.
Legați proprietatea playlistului (: Lista de redare = "playlist"
) și verificați funcționalitatea. Iată cum ar trebui să arate în acțiune:
După cum puteți vedea, cu un scop clar și o planificare adecvată, construirea unei aplicații Vue / Vuetify poate fi foarte ușoară și plăcută. Aveți acum un player de muzică de lucru pe care îl puteți utiliza în timpul relaxării sau timpului de codare. Desigur, există întotdeauna loc pentru îmbunătățiri și adăugiri suplimentare, deci iată câteva idei pe care le puteți încerca pentru a face jucătorul chiar mai bogat în funcții:
În acest tutorial, am văzut cât de ușor și plăcut poate fi să construiți o aplicație cu Vue.js și în special cu Vuetify.js. Sper că ți-a plăcut construirea acestui jucător la fel de mult ca și mine. Voi fi bucuros să văd propria versiune îmbunătățită a playerului. Deci, dacă creați unul, aruncați o legătură demo în comentarii!