1.主要代码
detail.wxml文件
<view class='detailContainer'>
<image class='headImg' src='{{isMusicPlay?detailObj.music.coverImgUrl:detailObj.detail_img}}'></image>
<image class='musicImg' catchtap='handleMusicPlay' src='{{isMusicPlay?"/images/music/music-start.png":"/images/music/music-stop.png"}}'></image>
<view class='avatar_date'>
<image src='{{detailObj.avatar}}'></image>
<text>{{detailObj.author}}</text>
<text>发布于</text>
<text>{{detailObj.date}}</text>
</view>
<text class='company'>{{detailObj.title}}</text>
<view class='collection_share_container'>
<view class='collection_share'>
<image wx:if='{{!isCollected}}' catchtap='handleCollection' src='/images/icon/collection-anti.png'></image>
<image wx:if='{{isCollected}}' catchtap='handleCollection' src='/images/icon/collection.png'></image>
<image catchtap='handleShare' src='/images/icon/share.png'></image>
</view>
<view class='line'></view>
</view>
<button open-type='share'>转发此文章</button>
<text class='content'>{{detailObj.detail_content}}</text>
</view>
detail.js文件
该文件实现主要实现3个功能:收藏,转发,音频播放。
(1)收藏功能:采用将收藏与否的信息存储到Storage中,以避免下次进入的时候或者刷新该信息丢失,由于有多个列表项,所以每次存入的都是一个对象,键值对分别为其对应的下标和是否收藏。同时还考虑到如果用户是第一次收藏,isCollected不一定为对象,所以需要初始化存入一个空对象,下次在进入该页面时,首先读取Storage中的收藏信息判断是否之前收藏过。wx.getStorage用于从本地缓存中异步获取收藏的内容,wx.setStorage将数据存储在本地缓存中中。会覆盖掉原来对应的内容,用于更新。还有wx.getStorageSync与wx.setStorageSync,这两者为同步版本,用于一开始加载页面时就读取或设置Storage。
(2)转发功能:使用wx.showActionSheet显示操作菜单
(3)音频播放:采用wx.getBackgroundAudioManager获取全局唯一的背景音频管理器,BackgroundAudioManager.play()和BackgroundAudioManager.pause()用于播放和暂停音乐。同时在点击图像界面时也需要控制音乐的播放和暂停。采用监听的方法:BackgroundAudioManager.onPlay(function callback)与BackgroundAudioManager.onPause(function callback)用于监听背景音乐的播放与否。为了保证离开此界面后再返回该界面仍具有上一次的记录,需要全局记录该变量(在app.js文件中添加相关的全局变量,便于后续读取)。
// pages/detail/detail.js
let datas = require('../../datas/list-data.js');
let bgMusic = wx.getBackgroundAudioManager();
let appDatas = getApp();
Page({
//页面的初始数据
data: {
detailObj: {},
id: null,
isCollected: false,
isMusicPlay: false,
},
//生命周期函数--监听页面加载
onLoad: function (options) {
console.log(options)
let id = options.id; //获取参数值
this.setData({
detailObj: datas.list_data[id],
id: id
})
//根据本地缓存的数据判断用户是否收藏当前的文章
let detailStorage = wx.getStorageSync('isCollected');
if(!detailStorage){ //如果用户第一次收藏,isCollected不一定为对象,所以需要初始化
//在缓存中初始化空对象
wx.setStorageSync('isCollected', {})
}
if(detailStorage[id]){ //若缓存为true,则动态设置isCollected为true
this.setData({
isCollected: true
})
}
//判断音乐是否在播放(防止点击播放后back后再回来不是播放状态,希望保留上一次的状态)
if(appDatas.globalData.isPlay && appDatas.globalData.pageId===id){
this.setData({
isMusicPlay: true
})
}
//监听音乐播放
bgMusic.onPlay(()=>{
console.log("音乐播放")
//修改isMusicPlay状态值
this.setData({
isMusicPlay: true
})
//修改appDatas中的数据(为了保留上一次离开的状态)
appDatas.globalData.isPlay = true
appDatas.globalData.pageId = id
})
//监听音乐暂停
bgMusic.onPause(()=>{
console.log("音乐暂停");
//修改isMusicPlay状态值
this.setData({
isMusicPlay: false
})
appDatas.globalData.isPlay = false
})
},
//处理点击收藏与否
handleCollection(){
let isCollected = !this.data.isCollected;
console.log(isCollected)
//更新状态
this.setData({
isCollected
})
//提示用户
let title = isCollected?"收藏成功":"取消收藏"
wx.showToast({
title,
icon: 'success'
})
//缓存数据到本地
//let obj = {} 不可行,会覆盖之前的状态
let id = this.data.id
wx.getStorage({
key: 'isCollected',
success: (datas)=>{
let obj = datas.data;
obj[id] = isCollected; //设置对应项的状态
wx.setStorage({
key: 'isCollected',
data: obj,
success: ()=>{
console.log('缓存成功')
}
})
}
})
},
//处理音乐播放
handleMusicPlay(){
let {dataUrl, title} = this.data.detailObj.music;
let isMusicPlay = !this.data.isMusicPlay;
this.setData({
isMusicPlay
});
//控制音乐播放
if(isMusicPlay){
//音乐播放
bgMusic.title = title,
bgMusic.src = dataUrl
bgMusic.play()
}else{
//音乐暂停
bgMusic.pause()
}
},
//处理点击分享功能
handleShare(){
wx.showActionSheet({
itemList: ['分享到朋友圈', '分享到QQ', '分享到微博']
})
},
})
3.