1 列表循环 2 单曲循环
单曲循环不做任何操作,则一直循环播放当前歌曲 单曲循坏模式下,点击上一首或下一首是播放上一首或下一首
3 随机播放
随机模式下,点击当前显示列表(列表A或列表B)歌曲前的播放按钮,都会把当前显示列表的数组打乱排序,再传入列表C,并找到该歌曲在乱序数组中的索引,并设置为当前播放索引。(因为当前播放歌曲是通过 arr[index] 获取,arr-列表C,index-当前播放索引)
4 另外
列表循环、单曲循环都是将列表A或列表B的数组直接传入列表C(排序不变)
随机模式是将列表A或列表B的数组打乱排序后传入
(1)当列表A为空数组时点击歌曲A播放或暂停按钮时,不会重新播放,也不会unshift到列表A,因为此时只是歌曲A播放与暂停切换。当列表A为空数组时点击上一首、下一首也是播放歌曲A。当列表A或列表B为空数组时,点击全部播放,不进行任何操作
(2)当列表A清空后点击另外几首歌曲时,会把这些歌曲unshift到列表A(保持在列表A的第一位),根据播放模式,对列表A数组进行排序再传入列表C,找到当前播放歌曲在列表C的索引,设置当前播放索引
- 重复点击同一首歌曲,不会重新播放,因为重复点击是:播放->暂停->播放->...
- 当前歌单列表(列表B)没有全部删除功能和删除单首歌曲功能
找到该歌曲在列表A的索引,然后删除该元素,传入列表C
2 .删除的是当前播放歌曲且当前播放歌曲是列表A仅有的一首歌
找到该歌曲在列表A的索引,然后删除该元素,将只包含当前歌曲的数组传入列表C,设置当前播放索引为0,因为当列表A为空数组时,列表C只需要这一首歌曲用来给播放器显示
找到该歌曲在列表A的索引,然后删除该元素,此时该歌曲仍然存在列表C并播放,在当前歌曲播放完成后,播放下一首之前,或者点击上一首或下一首时,根据播放模式排序后传入列表C,并将上述索引设置为当前索引。在列表循环和单曲循环模式下,下一首播放歌曲的索引即为被删除歌曲的索引,因此将该索引设置为当前播放索引。因为随机模式是乱序,对于下一首是随机,因此也可以直接将该索引设置为当前播放索引。如果没有下一首歌,直接设置当前索引为0。上一首播放歌曲的索引即为上述索引-1,如果超出范围,则设置为 列表C.length-1
若当前播放为列表C的第一首,点击上一首,则播放列表C的最后一首; 若当前播放为列表C的最后一首,点击下一首,则播放列表C的第一首
将该歌曲升至列表A的第一位,即找到该歌曲在列表A的索引,删除自身,然后unshift到列表A第一位,然后根据播放模式,对列表A数组进行排序再传入列表C,找到当前播放歌曲在列表C的索引,设置当前播放索引
把歌曲unshift到列表A(保持在列表A的第一位),根据播放模式,对列表A数组进行排序再传入列表C,找到这首歌曲在列表C的索引,设置当前播放索引。这一点与上述“最近播放列表点击全部删除按钮”的第(2)点一样
找到该歌曲在列表A的索引,删除自身,再把这首歌曲unshift到列表A(保持在列表A的第一位),根据播放模式,对列表A数组进行排序再传入列表C,找到这首歌曲在列表C的索引,设置当前播放索引
本项目的播放器组件仍然存在对element-ui的el-slider(音量调节)、message(消息提示)组件、better-scroll插件(歌词滚动)和Vuex的依赖,不能完全作为独立于本项目的可复用的组件。而且,播放器组件结构过于臃肿,维护难度较大。为了日后能够应用于其它项目,播放器组件应该是尽可能独立且不依赖UI库。
优化:将播放器组件再度拆分优化,将进度条、音量调节、歌词和播放列表分别拆分成单个组件。
增加收藏歌曲到歌单功能,增加播放歌曲页面,增加电台页面...
因为是使用sessionStorage缓存数据,有大小限制,设置了列表A的最大长度为50,若超过则删除最后一个超出的元素
本项目算是中大型项目,在写项目的时候能感受到vue2.x的优点和不足。这里优点不多说,懂的都懂。说下其中一个不足:当一个组件比较庞大且变量较多时,对于反复用到的变量经常需要在Model、View、ViewModel三者之间打marks反复跳转,而不是在一个独立的代码块里专注于对该变量操作。不过这点不足,已经在vue3里得到改善。
Vue.directive('preventReclick', {
// 当被绑定的元素插入到 DOM 中时
inserted(el, binding) {
// 不能用onclick,因为onclick只能执行元素绑定click的一个方法
el.addEventListener('click', () => {
if (el.disabled === false) {
el.disabled = true
// binding.value是指令所绑定的值
// 更多:https://cn.vuejs.org/v2/guide/custom-directive.html
setTimeout(() => {
el.disabled = false
}, binding.value || 2000)
}
})
},
})
Vue.directive('focus', {
// 当被绑定的元素插入到 DOM 中时
inserted(el) {
el.focus()
},
})
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。