Maison > interface Web > js tutoriel > le corps du texte

Instructions d'utilisation du composant Player dans vue-music

亚连
Libérer: 2018-06-23 17:19:52
original
1856 Les gens l'ont consulté

Cet article présente principalement en détail les informations pertinentes de vue-music sur le composant Player. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Les exemples de cet article sont partagés avec vous. à propos du composant Player est fourni pour votre référence. Le contenu spécifique est le suivant

Mini lecteur :

1. . Le composant lecteur sera ouvert sur chaque page. Définissez d'abord l'état global du lecteur dans vuex state.js

import {playMode} from 'common/js/config.js';

const state = {
 singer:{}, 
 playing:false, //是否播放
 fullScreen:false, //是否全屏
 playList:[], //播放列表
 sequenceList:[], // 非顺序播放列表
 mode:playMode.sequence, // 播放模式(顺序0,循环1,随机2)
 currentIndex:-1, //当前播放索引
}
export default state 


---------------------------------------------
// config.js

export const playMode = {
 sequence:0,
 loop:1,
 random:2
}
Copier après la connexion

2. Obtenez les données de la playlist en entrant dans la page du lecteur, modifiez l'état de lecture et ouvrez

dans la liste de la liste de musique Distribuez les événements au composant parent dans le composant song-list, transmettez les informations et l'index de la chanson actuelle

<li @click="selectItem(song,index)" v-for="(song,index) in songs" class="item">

------------------------------
selectItem(item,index){
 this.$emit(&#39;select&#39;,item,index)
},
Copier après la connexion

et acceptez l'événement distribué dans le composant music-list.

<song-list :rank="rank" :songs="songs" @select="selectItem"></song-list>
Copier après la connexion

3. Si vous validez plusieurs états, définissez-les dans des actions

import {playMode} from &#39;common/js/config.js&#39;

export const selectPlay = function({commit,state},{list,index}){
 commit(types.SET_SEQUENCE_LIST, list)
 commit(types.SET_PLAYLIST, list)
 commit(types.SET_CURRENT_INDEX, index)
 commit(types.SET_FULL_SCREEN, true)
 commit(types.SET_PLAYING_STATE, true)
}
Copier après la connexion

4 Utilisez mapActions dans le composant music-list pour soumettre la valeur modifiée

import {mapActions} from &#39;vuex&#39;

methods:{
 selectItem(item,index){
  this.selectPlay({
  list:this.songs,
  index
  })
 },
 ...mapActions([
  &#39;selectPlay&#39;
 ])
 },
Copier après la connexion
.

5. Obtenez le statut global de Vuex dans Palyer et attribuez le statut à l'emplacement correspondant (le code est le code complet, veuillez le comprendre lentement selon l'explication plus tard)

<p class="player" v-show="playList.length>0">    // 如果有列表数据则显示
  <p class="normal-player" v-show="fullScreen">  //如果全屏
   <p class="background">
   <img :src="currentSong.image" alt="" width="100%" height="100%">    //模糊背景图
   </p>
   <p class="top">
    <p class="back" @click="back">
    <i class="icon-back"></i>
    </p>
    <h1 class="title" v-html="currentSong.name"></h1>    //当前歌曲名称
    <h2 class="subtitle" v-html="currentSong.singer"></h2>  //当前歌手名
   </p>
   <p class="middle">
    <p class="middle-l">
    <p class="cd-wrapper">
     <p class="cd" :class="cdCls">
     <img :src="currentSong.image" alt="" class="image">    //封面图
     </p>
    </p>
    </p>
   </p>
   <p class="bottom">
   <p class="progress-wrapper">
   <span class="time time-l">{{ format(currentTime) }}</span>
   <p class="progress-bar-wrapper">
    <progress-bar :percent="percent" @percentChange="onProgressBarChange"></progress-bar>
   </p>
   <span class="time time-r">{{ format(currentSong.duration) }}</span>
   </p>
     <p class="operators">
    <p class="icon i-left">
     <i :class="iconMode" @click="changeMode"></i>
    </p>
     <p class="icon i-left" :class="disableCls">
      <i @click="prev" class="icon-prev"></i>
      </p>
      <p class="icon i-center" :class="disableCls">
      <i :class="playIcon" @click="togglePlaying"></i>
      </p>
      <p class="icon i-right" :class="disableCls">
      <i @click="next" class="icon-next"></i>
      </p>
      <p class="icon i-right">
      <i class="icon icon-not-favorite"></i>
      </p>
    </p>
    </p>
   </p>
   </transition>
   <transition name="mini">
    <p class="mini-player" v-show="!fullScreen" @click="open">
     <p class="icon">
      <img :src="currentSong.image" alt="" width="40" height="40" :class="cdCls">
     </p>
     <p class="text">
      <h2 class="name" v-html="currentSong.name"></h2>
      <p class="desc" v-html="currentSong.singer"></p>
     </p>
     <p class="control">
      <i :class="miniIcon" @click.stop="togglePlaying"></i>
     </p>
     <p class="control">
      <i class="icon-playlist"></i>
     </p>
    </p>
   </transition>
   <audio :src="currentSong.url" ref="audio" @canplay="ready" @error="error" @timeupdate="updateTime" @ended="end"></audio>
 </p>
Copier après la connexion

Ouvrez le statut du joueur

import {mapGetters,mapMutations} from &#39;vuex&#39;;

...mapGetters([
 &#39;fullScreen&#39;,
 &#39;playList&#39;,
 &#39;currentSong&#39;,
 &#39;playing&#39;,
 &#39;currentIndex&#39;,
])
Copier après la connexion

Remarque : les valeurs ne peuvent pas être attribuées directement dans le composant. L'état this.fullScreen = false dans la vuex modifiée doit être modifié via des mutations. Ensuite, définissez les types de mutations. utilisez la méthode proxy mapMutations de vuex pour appeler

[types.SET_FULL_SCREEN](state, flag) {
 state.fullScreen = flag
 },

import {mapGetters,mapMutations} from &#39;vuex&#39;;
methods:{
 ...mapMutations({
 setFullScreen:"SET_FULL_SCREEN", 
 }),
 back(){
 this.setFullScreen(false)
 },
}
Copier après la connexion

pour définir la méthode du bouton de lecture

 <i :class="playIcon" @click="togglePlaying"></i>
Copier après la connexion
togglePlaying(){
 this.setPlayingState(!this.playing); //改变全局变量playing 的属性
},

// 然后watch 监听playing 操作实际的audio 标签的播放暂停
watch:{
  playing(newPlaying){
   let audio = this.$refs.audio;
   this.$nextTick(() => {
    newPlaying ? audio.play():audio.pause();
   })
  }
 },

// 用计算属性改变相应的播放暂停图标
playIcon(){
 return this.playing? &#39;icon-pause&#39;:&#39;icon-play&#39;
},
Copier après la connexion

Définissez les méthodes du bouton de lecture de la chanson précédente et suivante. Utilisez mapGetters pour obtenir la valeur de currentIndex (plus un ou moins un) et modifiez-la, modifiant ainsi l'état de currentSong et écoutant le changement de lecture. Déterminez la réinitialisation de la limite de playlist.

prev(){
    if(!this.songReady){
      return;
    }

 let index = this.currentIndex - 1;
 if(index === -1){    //判断播放列表界限重置
  index = this.playList.length-1;
 }
 this.setCurrentIndex(index);
 if(!this.playing){  //判断是否播放改变播放暂停的icon
  this.togglePlaying();
 }
 this.songReady = false;
},
next(){
 if(!this.songReady){
    return;
   }
 let index = this.currentIndex + 1;
 if(index === this.playList.length){    //判断播放列表界限重置
  index = 0;
 }
 this.setCurrentIndex(index);
 if(!this.playing){
  this.togglePlaying();
 }
 this.songReady = false;
},
Copier après la connexion

Écoutez l'événement canpaly de la balise d'élément audio, lorsque la chanson est chargée, et l'événement d'erreur, lorsqu'une erreur se produit dans la chanson, offrez une expérience utilisateur pour empêcher les utilisateurs de changer rapidement et de provoquer erreurs.

Définissez le drapeau songReady. Si la chanson n'est pas prête, renvoyez directement false en cliquant sur la chanson suivante

data(){
 return {
  songReady:false,
 }
},

ready(){
 this.songReady = true;
},
error(){
 this.songReady = true;
},
Copier après la connexion

Barre de progression

audio. element Écoutez l'événement timeupdate pour obtenir l'horodatage de l'attribut lisible et inscriptible de l'heure de lecture actuelle. Utilisez formt pour formater le traitement du temps (_pad est une fonction de remplissage nul)

Obtenez la durée totale de l'audio currentSong.duration

<p class="progress-wrapper">
 <span class="time time-l">{{ format(currentTime) }}</span>
 <p class="progress-bar-wrapper">
 <progress-bar :percent="percent" @percentChange="onProgressBarChange"></progress-bar>
 </p>
 <span class="time time-r">{{ format(currentSong.duration) }}</span>
</p>

<audio :src="currentSong.url" ref="audio" @canplay="ready" @error="error" @timeupdate="updateTime" @ended="end"></audio>
Copier après la connexion
updateTime(e){
 this.currentTime = e.target.currentTime; // 获取当前播放时间段
},

format(interval){
 interval = interval | 0;
 const minute = interval/60 | 0;
 const second = this._pad(interval % 60);
 return `${minute}:${second}`;  
},

_pad(num,n=2){
 let len = num.toString().length;
 while(len<n){
 num = &#39;0&#39; + num;
 len ++;
 }
 return num;
},
Copier après la connexion

Créez un composant de barre de progression pour recevoir le paramètre de progression en pourcentage, définit la largeur de la barre de progression et la position de la balle. Le composant lecteur définit le pourcentage de propriété calculé

percent(){
 return this.currentTime / this.currentSong.duration  // 当前时长除以总时长
},
Copier après la connexion

composant de la barre de progression

<p class="progress-bar" ref="progressBar" @click="progressClick">
 <p class="bar-inner">
  <p class="progress" ref="progress"></p>
  <p class="progress-btn-wrapper" ref="progressBtn"
   @touchstart.prevent="progressTouchStart"
   @touchmove.prevent="progressTouchMove"
   @touchend="progressTouchEnd"  
  >
  <p class="progress-btn"></p>
  </p>
 </p>
 </p>
Copier après la connexion
const progressBtnWidth = 16 //小球宽度

props:{
 percent:{
 type:Number,
 default:0
 }
},


watch:{
 percent(newPercent){
 if(newPercent>=0 && !this.touch.initated){    
  const barWidth = this.$refs.progressBar.clientWidth - progressBtnWidth;
  const offsetWidth = newPercent * barWidth;
  this.$refs.progress.style.width = `${offsetWidth}px`;
  this.$refs.progressBtn.style.transform=`translate3d(${offsetWidth}px,0,0)`
 }
 }
}
Copier après la connexion

Définir le glissement

Ajoutez des méthodes d'écoute d'événements touchstart, touchmove et touchend sur le petit bouton de la barre de progression progressBtn, ajoutez Prevent à l'événement pour empêcher le comportement par défaut du navigateur de glisser et obtenez les informations de glisser pour le calcul

Créer une touche objet sur l'instance Maintenir les informations d'état de partage de communication entre différents rappels. Dans la méthode événementielle touchstart, définissez d'abord this.touch.initiated sur true, indiquant que le glissement a commencé. Enregistrez la position de clic de départ e.touches[0].pageX et enregistrez-la sur l'objet tactile pour enregistrer la largeur de progression actuelle.

Dans touchmove, déterminez d'abord si la méthode touchstart a été saisie en premier et calculez la position déplacée moins la longueur de décalage de la position de départ du clic. let deltax = e.touches[0].pageX - this.touch.startX

peut définir la longueur existante de la barre de progression ainsi que la longueur de décalage. La largeur maximale ne peut pas dépasser la largeur de la barre de progression parent

Appelez la méthode this._offset(offsetWidth) pour définir la largeur de la barre de progression

Définissez this.touch.initiated sur false dans le touchend méthode d'événement pour indiquer la fin du glissement et envoyer l'événement au composant lecteur. Définissez la valeur currentTime de l'audio sur la valeur correcte. Le paramètre est pencent

. Ajoutez un événement de clic dans la barre de progression, appelez this._offset. (e.offsetX) et envoyer l'événement

 created(){
 this.touch = {};
 },

methods:{
 progressTouchStart(e){
 this.touch.initiated = true;
 this.touch.startX = e.touches[0].pageX;
 this.touch.left = this.$refs.progress.clientWidth;
 },
 progressTouchMove(e){
 if(!this.touch.initiated){
  return;
 }
 let deltaX = e.touches[0].pageX - this.touch.startX;
 let offsetWidth = Math.min(this.$refs.progressBar.clientWidth - progressBtnWidth,Math.max(0,this.touch.left + deltaX));
 this._offset(offsetWidth);
 },
 progressTouchEnd(e){
 this.touch.initiated = false;
 this._triggerPercent();
 },
 progressClick(e){
 const rect = this.$refs.progressBar.getBoundingClientRect();
 const offsetWidth = e.pageX - rect.left;
 this._offset(offsetWidth);
 // this._offset(e.offsetX);
 this._triggerPercent();
 },
 _offset(offsetWidth){
 this.$refs.progress.style.width = `${offsetWidth}px`;
 this.$refs.progressBtn.style[transform] = `translate3d(${offsetWidth}px,0,0)`;
 },
 _triggerPercent(){
 const barWidth = this.$refs.progressBar.clientWidth - progressBtnWidth;
 const percent = this.$refs.progress.clientWidth / barWidth;
 this.$emit("percentChange",percent)
 }
},
Copier après la connexion

Cet article a été organisé dans le "Tutoriel d'apprentissage des composants frontaux Vue.js". Tout le monde est invité à apprendre et à lire.

Pour les didacticiels sur les composants vue.js, veuillez cliquer sur le didacticiel spécial d'apprentissage des composants vue.js pour apprendre.

Pour plus de tutoriels d'apprentissage Vue, veuillez lire le sujet spécial "Tutoriel pratique Vue"

Ce qui précède est ce que j'ai compilé pour vous, j'espère qu'il vous sera utile à l'avenir.

Articles associés :

Comment intégrer l'image du carrousel dans mint-ui dans vue.js

Comment l'implémenter dans Jstree Les nœuds enfants désactivés seront également sélectionnés lorsque le nœud parent est sélectionné

À propos de l'utilisation des filtres dans Vue

Adaptatif dans la méthode de traitement Javascript

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal