小程序开发-10-新版Music组件、组件通信与wxss样式复用

加入缓存提升用户体验

思路:先从缓存中寻找数据或者从服务器中获取数据写入缓存中

优点:减少网络访问次数,提升用户体验

解决缓存带来的问题

问题:比如原先是不喜欢的在点击喜欢的时候,跳到下一期刊后返回来再次点击会报错。原因是点击不喜欢后服务器端更新了,但加入缓存后返回来的时候期刊依然是缓存中的,所以会出现请求错误。

解决:单独请求获取喜欢的状态,在控件上不使用缓存中的数据

ES6模板字符串和扩展运算符的应用

模板字符串

  • 作用,增强代码可读性
console.log(a+'456');//代码可读性不强
console.log(`${a}456`);//可读性更强

扩展运算符

  • 作用,可以有效减少wxml中对象的使用,比如
  • 缺点,可读性不太好,有些时候不知道对象中有些什么数据
//原先的写法
this.setData({
 classic: res
})
//扩展运算符写法
this.setData({
 classic: ...res//res是从服务端获取的数据
})
在wxml中
//原先的写法
<Text>{{classic.id}}</Text>
//之后的写法
<Text>{{id}}</Text>

让对象中的属性直接平铺了出来

独立更新like组件的状态

将data中的count和state单独提取出来

让自定义组件支持hidden

  • wx:if条件语法
<v-music wx:if='{{false}}'/>
<v-essay wx:if='{{false}}'/>
<v-movie wx:if='{{true}}'/>
  • 组件的hidden属性,但是hidden只会作用于小程序自身的组件,对自定义组件无效。所以我们可以通过传值来达到这样的效果
page页面的wxml
<v-music hidden="{{fasle}}"/>
组件内的js
properties:{
hidden: {
  type: Boolean
}
}
组件的wxml
<View hidden="{{hidden}}">
  ...
</View>

wx:if和hidden的区别

wx:if会完整的执行组件的生命周期,而hidden不会。hidden只会控制组件的隐藏和显示。

解决wxss在组件间的复用问题

  • 在组件同级目录下面新建common.wxss文件
  • 将共同wxss代码复制到common.wxss文件中
  • 在组件的wxss中引用
@import "../common.wxss";

音乐组件的具体实现

  • 老版实现方式
  • 新版实现方式
    • 实现点击后图片状态切换,同时音频响起
    • 当当前音乐出于播放状态的时候,切换不同期刊后切回来,音乐继续播放同时界面上显示的是要暂停的图标
    • 代码优化
组件的wxml代码
<image bind:tap="onPlay" src="{{playing?playSrc:pauseSrc}}" title="{{classic.title}}"/>
组件的js代码
const mMgr = wx.getBackgroundAudioManager();
properties: {
src: {
    title: String
   type: String
}
}
data: {
...
}
attached: function(){
 //恢复状态
 this._recoverStatus();
 //监听音乐播放
 this._monitorSwitch();
},
//detached: {
//    mMgr.stop();
//}
method:{
onPlay: function(e){
   if(!this.data.playing){
       //图片切换
       this.setData({
          paying: true
      })
      //音乐播放
      mMgr.src = this.properties.src;
      mMsgr.title = this.properties.title;
   }else{
       //图片切换
       this.setData({
          paying: false
      })
       //音乐停止
       mMgr.pause();
   }
},
//让后台播放器与界面图标同步
_monitorSwitch: function(){
  mMgr.onPlay(()=>{
      this._recoverStatus();
  })
  mMgr.onPause(() => {
      this._recoverStatus();
  })
  mMgr.onStop(() => {
      this._recoverStatus();
  })
  mMgr.onEnded(() => {
      this._recoverStatus();
  })
},
//恢复状态
_recoverStatus: function () {
  if (mMgr.paused) {
      this.setData({
          playing: false
      })
      return;
  }
  if (mMgr.src === this.properties.src) {
      this.setData({
          playing: true
      })
  }
},
}

实现音乐控件的旋转效果

动画API

CSS3的canvas

//css3动画实现,在组件的wxss里添加这段代码
.rotation {
-webkit-transform: rotate(360deg);
animation: rotation 12s linear infinite;
-moz-animation: rotation 12s linear infinite;
-webkit-animation: rotation 12s linear infinite;
-o-animation: rotation 12s linear infinite;
}

@-webkit-keyframes rotation {
from {
 -webkit-transform: rotate(0deg);
}
to {
 -webkit-transform: rotate(360deg);
}
}
//在组件的wxml添加样式
<image src="..." class="{{playing?'rotation':''}}"/>

对Component和Model应用的理解

业务代码最好写在Model里面

多热合作的时候每个人写自己的Component,最后放到组件目录下调用就可以了

组件通信

方案一,利用页面做转发

小程序开发-10-新版Music组件、组件通信与wxss样式复用

上一篇:没有基础也能写个小程序


下一篇:小程序入门学习Demo