Пусть работа сопровождает (vue) музыку

внешний интерфейс Ресурсы изображений Vue.js CSS

предисловие

В последнее время я самообучаюсь Vue, и планирую имитировать проект, чтобы практиковать его самостоятельно. Так как я люблю слушать песни, я выбираю NetEase Cloud Music. Я поделюсь с вами проблемами, с которыми я столкнулся, и я надеюсь, что Есть некоторые недостатки Мы даем несколько ценных советов, учимся друг у друга и вместе добиваемся прогресса.

О стеке технологий, используемом проектом

  • Vue: использование синтаксиса Vue

  • Vuex: реализовать совместное использование состояния между различными компонентами

  • vue-router: необходим для управления маршрутизацией одностраничных приложений.

  • axios: инициировать http-запрос

  • SASS (SCSS): язык предварительной обработки CSS.

проект

Из-за ограниченного времени я только что сделал функцию воспроизведения страницы, которая использует API NetEase Cloud Music.Облако NetEase, те, кто заинтересован, могут пойти и поиграть, что также требует некоторых знаний, которыми я поделюсь с вами здесь.

Над

Весь эффект:

)

Поделитесь процессом создания этой отдельной страницы

Это одна страница, состоящая из компонента заголовка, компонента нижнего колонтитула, компонента musicList и компонента воспроизведения.

1. Как получить музыкальные данные

Я взял его из API NetEase Cloud Music. После того, как я его подобрал, я создал новый файл, поместил в него данные и получил их через axios. Некоторые из кодов следующие:

actions: {
    getData({ commit,state }) {
      if (localStorage.musics !== '[]' && localStorage.musics) {
        state.musicData = JSON.parse(localStorage.musics);
        return;
      }
      return new Promise((resolve, reject) => {
        Vue.axios.get('music-data')
            .then (res => {
              if (res.data.error === 0) {
                state.musicData = res.data.musicData;
                localStorage.musics = JSON.stringify(state.musicData);
              }
            })
            .then(() => {
              commit('toggleMusic',0)
            });
        resolve();
      });
    }
  }

2. Функция удаления

Здесь я связал событие под значком удаления, в основном всего две строки кода:

<span v-on:click="del(index)" class="del-icon"></span>
在methods定义del事件就好了
        del(index){
            this.$store.commit('del',index);
        }

3. Элементы управления воспроизведением хвоста

Функция воспроизведения в конце В начале я столкнулся с проблемой, как получить время песни и контролировать ход воспроизведения. Позже я решил эту проблему, поискав информацию и Baidu.

Часть кода для получения времени песни выглядит следующим образом:

 <span class="start">{{transformTime(now)}}</span>
 js部分代码
  this.nativeAudio = document.querySelector('audio');
    this.nativeAudio.addEventListener('play', () => {
      this.totalTime = this.transformTime(this.nativeAudio.duration);
      this.now = this.nativeAudio.currentTime;
      setInterval(() => {
        this.now = this.nativeAudio.currentTime;
      }, 1000)
    })
    
    transformTime(seconds) {
      let m, s;
      m = Math.floor(seconds / 60);
      m = m.toString().length == 1 ? ('0' + m) : m;
      s = Math.floor(seconds - 60 * m);
      s = s.toString().length == 1 ? ('0' + s) : s;
      return m + ':' + s;
    }

Часть кода для контроля прогресса воспроизведения выглядит следующим образом

changeTime(event) {
      let progressBar = this.$refs.progressBar;
      let coordStart = progressBar.getBoundingClientRect().left;  //getBoundingClientRect()方法返回元素的大小及其相对于视口的位置
      let coordEnd = event.pageX;
      this.nativeAudio.currentTime = (coordEnd - coordStart) / progressBar.offsetWidth * this.nativeAudio.duration;
      this.now = this.nativeAudio.currentTime;
      this.nativeAudio.play();
      this.$store.commit('play', true);
    },
touchMove(event) {
      let progressBar = this.$refs.progressBar;
      let coordStart = progressBar.getBoundingClientRect().left;
      let coordEnd = event.touches[0].pageX;
      this.$refs.now.style.width = ((coordEnd - coordStart) / progressBar.offsetWidth).toFixed(3) * 100 + '%';  //toFixed(3)保留小数点后3位
    },
touchEnd(event) {
      this.nativeAudio.currentTime = this.$refs.now.style.width.replace('%', '')/100 * this.nativeAudio.duration;
      this.now = this.nativeAudio.currentTime;
      this.nativeAudio.play();
      this.$store.commit('play', true);
    },

4. Скиннинг

Скиннинг в основном предоставляет четыре цвета, красный, синий, черный и зеленый, стиль использует гибкую компоновку, основной код CSS выглядит следующим образом:

.skin {
        position: absolute;
        display: flex;
        flex-direction: column;
        bottom: 50px;
        right: 15px;
        width: 30px;
        .skin-colors {
          flex: 4;
          width: 100%;
          display: flex;
          justify-content: center;
          align-items: center;
          flex-direction: column;
          .selected {
            border: 1px solid white;
          }
          i {
            flex: 1;
            display: inline-block;
            width: 20px;
            height: 20px;
            cursor: pointer;
            border-radius: 10px;
            margin-bottom: 5px;
          }
          i.one {
            background-color: #B72712;
          }
          i.two {
            background-color: #1565C0;
          }
          i.three {
            background-color: #212121;
          }
          i.four {
            background-color: #1B5E20;
          }
        }
        .icon-skin {
          flex: 1;
          width: 100%;
          height: 30px;
          background-repeat: no-repeat;
          background-size: contain;
          margin-top: 3px;
          cursor: pointer;
        }
        .icon-skin-red {
          background-image: url('./skinRed.svg');
        }
        .icon-skin-green {
          background-image: url('./skinGreen.svg');
        }
        .icon-skin-blue {
          background-image: url('./skinBlue.svg');
        }
        .icon-skin-black {
          background-image: url('./skinBlack.svg');
        }

5. Управляйте воспроизведением предыдущей и следующей песни песни

Часть кода выглядит следующим образом:

    prev() {
      this.audio.index = this.audio.index === 0 ? this.musicData.length - 1 : (--this.audio.index);
      this.$store.commit('toggleMusic', this.audio.index);
    }
    
    next() {
      this.audio.index = this.audio.index === this.musicData.length - 1 ? 0 : (++this.audio.index);
      this.$store.commit('toggleMusic', this.audio.index);
    }

Резюме: Получите более четкое представление о предыдущем использовании каждого компонента и совместном использовании состояния различных компонентов, имитируя этот проект. Конечно, я тоже столкнулся с некоторыми ямами.Статья написана здесь, и она не полностью закончена.Я написал только одну страницу, но это тоже небольшое резюме.Далее прикрепляю свой исходный код:Исходный код проекта, Заинтересованные друзья могут взглянуть на то, как помочь указать звезду и вилку, и надеяться помочь некоторым друзьям. Как студент, который собирается стать старшим, время действительно драгоценно, и я не смею расслабляться в учебе.Если у вас есть хорошие идеи, вы можете связаться со мной по qq: 137032979. Кодировать слова непросто , надеюсь всем понравится. Впереди долгий путь, и я разделю его с вами.