微信小程序实战教程:模仿—网易云音乐(二)
2017-05-18 16:14
555 查看
接上一篇:微信小程序实战教程:模仿—网易云音乐(一)
wxml进行渲染:
添加歌曲:
我的可以在本地缓存中添加两个key入对应的信息
like:我的喜欢
recent:最近
选择事件
点击添加按钮,向上呼出选项,将当前播放的歌曲设置到对应的数组即可
进行当前歌曲的播放:
页面onshow的时候,获取本地缓存的信息,在success的回调中,设置到data,以供页面解析,而后在获取歌词的函数中也进行一次回调,设置歌词,
播放本地音乐,播放成功之后,在success的回调中,获取正在播放的音乐信息,包括该歌曲的总时长,再进行设置。
这样我们不知不觉进入多个回调嵌套的问题
代码优化,使用Promise,较为优雅地解决回调
小程序暂时不支持async await
在 common.js 中为小程序提供的api上裹上一层Promise,并且通过module.exports = operation暴露出去
module.exports = operation
重写一下当前歌曲播放事件
这样即可缩减部分代码。
github源码:https://github.com/MengZhaoFly/wechatApp-netease_cloudmusic
点我下载:wechatApp-netease_cloudmusic-master.rar
wxml进行渲染:
<!--歌词--> <view class="lyric-content" hidden="{{islyric}}" style="height:401px; overflow-y: scroll;" bindtap="showCircle"> <view class="lyric" style="overflow-y: scroll;"> <block wx:for="{{lyricArr}}" > <view> {{item}} </view> </block> </view> </view>
添加歌曲:
我的可以在本地缓存中添加两个key入对应的信息
like:我的喜欢
recent:最近
选择事件
radioChange: function(e) { console.log('radio发生change事件,携带value值为:', e.detail.value) this.setData({ percent:'100%' }) }, //radio发生change事件,携带value值为: like //radio发生change事件,携带value值为: recent
点击添加按钮,向上呼出选项,将当前播放的歌曲设置到对应的数组即可
进行当前歌曲的播放:
页面onshow的时候,获取本地缓存的信息,在success的回调中,设置到data,以供页面解析,而后在获取歌词的函数中也进行一次回调,设置歌词,
播放本地音乐,播放成功之后,在success的回调中,获取正在播放的音乐信息,包括该歌曲的总时长,再进行设置。
onShow: function () { var that = this; console.log('正在播放 is on show') // 获取缓存 wx.getStorage({ key: 'clickdata', success: function (res) { var value = res.data var id = value.id if (value) { // 设置到data that.setData({ id:id, name: value.name, src: value.mp3Url, poster: value.picUrl, author: value.singer }) getlyric(id,function(data, lyricArr){ that.setData({ lyricobj:data, lyricArr:lyricArr }) }) } let url = that.data.src || value.mp3Url; // 播放 wx.playBackgroundAudio({ dataUrl: value.mp3Url, title: value.name, coverImgUrl: value.picUrl, success: function () { wx.hideLoading() console.log('url',url) setTimeout(function(){ wx.getBackgroundAudioPlayerState({ success: function (res) { var tempduration = res.duration console.log('get bg success', tempduration, res) // 设置时长 that.setData({ sumduration: tempduration }) }, complete: function (res) { console.log(' get bg complete:', res) } }) },1000) }, complete:function(){ // 获取正在播放的信息 console.log('play',url) } }) } }) },
这样我们不知不觉进入多个回调嵌套的问题
代码优化,使用Promise,较为优雅地解决回调
小程序暂时不支持async await
在 common.js 中为小程序提供的api上裹上一层Promise,并且通过module.exports = operation暴露出去
const operation = { getMusicData: function () { return new Promise((resolve, reject) => { wx.getBackgroundAudioPlayerState({ success: function (res) { resolve(res); }, fail: function (err) { reject(err); } }) }) }, // 播放音乐 参数:url title 图片url playMusic: function (url, title, pic) { return new Promise((resolve, reject) => { wx.playBackgroundAudio({ dataUrl: url, title: title, coverImgUrl: pic, success: function () { resolve(true) }, fail: function () { reject(new Error('播放错误')); } }) }) }, asyncGetStorage: function (key) { return new Promise((resolve, reject) => { wx.getStorage({ key: key, success: function (res) { resolve(res.data) }, fail: function (err) { reject(err) } }) }) }, getlyric: function (id) { return new Promise((resolve, reject) => { console.log('id:', id) let url = `http://neteasemusic.leanapp.cn/lyric` wx.request({ url: url, data: { id: cbd4 id }, method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT // header: {}, // 设置请求的 header success: function (res) { // success if (!res.data.lrc.lyric) return false; let lyric = res.data.lrc.lyric let timearr = lyric.split('[') let obj = {} let lyricArr = [] // seek 为键 歌词为value timearr.forEach((item) => { let key = parseInt(item.split(']')[0].split(':')[0]) * 60 + parseInt(item.split(']')[0].split(':')[1]) let val = item.split(']')[1] obj[key] = val }) for (let key in obj) { // obj[key] = obj[key].split('\n')[0] lyricArr.push(obj[key]) } // cb && cb(obj, lyricArr) resolve(lyricArr) }, fail: function (err) { reject(err) }, complete: function (res) { // complete } }) }) } }
module.exports = operation
重写一下当前歌曲播放事件
onShow: function () { let that = this; Common.asyncGetStorage('clickdata')//本地缓存 .then(data => { // console.log(data) if (!data) return; that.setData({ id: data.id, name: data.name, src: data.mp3Url, poster: data.picUrl, author: data.singer }) return Common.playMusic(data.mp3Url, data.name, data.picUrl); }) .then(status => { if(!status) return; wx.hideLoading(); console.log('id,',that.data.id) return Common.getlyric(that.data.id) }) .then((lyricArr) => { console.log('lyricArr',lyricArr) that.setData({ lyricArr: lyricArr }) return Common.getMusicData() }) .then(data => { let tempduration = data.duration console.log('get bg success', tempduration, data) // 设置时长 that.setData({ sumduration: tempduration }) }) },
这样即可缩减部分代码。
github源码:https://github.com/MengZhaoFly/wechatApp-netease_cloudmusic
点我下载:wechatApp-netease_cloudmusic-master.rar
相关文章推荐
- 微信小程序实战教程:模仿—网易云音乐(一)
- 微信小程序实战教程
- 【实战教程】腾讯云&搭建微信小程序服务
- 微信小程序教学第三章第三节(含视频):小程序中级实战教程:视图与数据关联
- 微信小程序教学第四章第二节(含视频):小程序中级实战教程:详情-视图渲染
- 微信小程序教学第三章第四节(含视频):小程序中级实战教程:下拉更新、分享、阅读标识
- 最新微信小程序(应用号)视频教程,实战教程
- 微信小程序教学第三章(含视频):小程序中级实战教程:列表-静态页面制作
- [干货教程]仿网易云课堂微信小程序开发实战经验
- 微信小程序教学第四章第一节(含视频):小程序中级实战教程:详情-页面制作
- [干货教程]仿网易云课堂微信小程序开发实战经验
- 微信小程序实战教程1503---生成二维码
- 微信小程序教学第二章(含视频):小程序中级实战教程之预备篇 - 封装网络请求及 mock 数据
- 【实战教程】腾讯云&搭建微信小程序服务
- 微信小程序教学第三章第三节(含视频):小程序中级实战教程:视图与数据关联
- 全球首个实战类微信小程序开发教程
- 微信小程序教学第二章:小程序中级实战教程之预备篇 - 项目结构设计 |基于最新版1.0开发者工具
- 微信小程序教学第二章(含视频):小程序中级实战教程之预备篇 - 提取util公用方法 |基于最新版1.0开发者工具
- 微信小程序教学第四章第二节(含视频):小程序中级实战教程:详情-视图渲染
- 微信小程序教学第三章第四节(含视频):小程序中级实战教程:下拉更新、分享、阅读标识