1.开发过程
1.1.使用接口
今日开发小程序时,需要点击当前video播放,其它video暂停。
下面来记录一下
首先我先在小程序开发文档中找了对应的 API , 找了半天发现了这个
下面也附上了此API获取实例中的一些方法
上面的实例的方法没有全部列出,大家可以到 小程序文档 中查看。
小程序有很多的接口,说明其实并不那么详细,所以说找接口时也浪费了很多时间。
附上代码
wxml代码:
<block wx:for='{{video}}'> <video id='{{item.id}}' bindplay="{{'play'+item.id}}" src='{{item.url}}' poster='{{item.fm_logo}}' enable-progress-gesture='true'></video> </block> //这里遍历的视频有 4 个。简化了一下代码,看的更清楚些。js 代码:
onReady: function (res) { this.videoContext1 = wx.createVideoContext('1') this.videoContext2 = wx.createVideoContext('2') this.videoContext3 = wx.createVideoContext('3') this.videoContext4 = wx.createVideoContext('4') //创建wx.createVideoContext对象,有四个视频所以创建四个对象来控制视频 }, //控制除了点击之外的视频停止播放 //stop() 为 API 创建的对象中的方法 play1: function(enl){ this.videoContext2.stop() this.videoContext3.stop() this.videoContext4.stop() }, play2: function (enl) { this.videoContext1.stop() this.videoContext3.stop() this.videoContext4.stop() }, play3: function (enl) { this.videoContext2.stop() this.videoContext1.stop() this.videoContext4.stop() }, play4: function (enl) { this.videoContext2.stop() this.videoContext3.stop() this.videoContext1.stop() }到这里功能就已经实现了,但是事情还没完,真写成这样就太辣鸡了。
因为视频是后台数据传过来的,所以页面中可能不会只有4个视频,要是传过来10个视频怎么办呢,所以说我们要根据视频的数量来动态的实现这个功能。
于是开始重构代码
1.2.重构代码
html代码:
<block wx:for='{{video}}'> <video id='{{item.id}}' bindplay="play" src='{{item.url}}' poster='{{item.fm_logo}}' enable-progress-gesture='true'></video> </block> //修改了bindplay,不再定义四个事件函数js代码:
1.数据请求时遍历接口
onLoad: function(options) { var i = this app.util.request({ url: "entry/wxapp/refuse", success: function(t) { i.setData({ video: t.data.video, //获取video数据 num: t.data.video.length //获取视频数量 }) var num = t.data.video.length //获取视频数量 for(var a = 1;a <= num; a++){ i[`videoContext${a}`] = wx.createVideoContext(`${a}`) //渲染创建wx.createVideoContext对象 } } }) }, play: function(enl){ var nums = this.__data__.num //获取后台传入的视频数量,此处在不同开发版本可能会有一点差异,需要自行调试 var id = enl.currentTarget.id //获取每次点击的视频id for(var a = 1; a <= nums; a++){ if (a != id) { this[`videoContext${a}`].stop() } //实现除点击外的video暂停 }},写到这里,就可以实现我们的功能了。
1.3.注意
着重说一下上文渲染API的代码
for(var a = 1;a <= num; a++){ i[`videoContext${a}`] = wx.createVideoContext(`${a}`) }// i.videoContext1 = wx.createVideoContext('1') // i.videoContext2 = wx.createVideoContext('2')// i.videoContext3 = wx.createVideoContext('3')// i.videoContext4 = wx.createVideoContext('4')i[`videoContext${a}`] = wx.createVideoContext('' + a + '') // 正确i[`videoContext${a}`] = wx.createVideoContext(`${a}`) // 正确i[`videoContext${a}`] = wx.createVideoContext('`${a}`') // 错误i[`videoContext${a}`] = wx.createVideoContext("'" + a + "'") // 错误i.`videoContext${a}` = wx.createVideoContext('' + a + '') // 错误i.videoContext`${a}` = wx.createVideoContext('' + a + '') // 错误此处用到了ES6模板字符串以及对象的属性名表达式,也是之前的基础打的不够牢固,以至于这里卡了很久
2.总结
2.1.wx.createVideoContext( )
- 此接口可以创建video的上下文对象,VideoContext 通过 id 跟一个 video 组件绑定,操作对应的 video 组件。
videoContext = wx.createVideoContext('id')两个参数
第一个参数:组件的 id(必填)
第二个参数:在自定义组件情况下,当前组件实例的this,以操作组件内 video 组件返回值
返回一个 VideoContext 对象方法
见小程序文档
2.2.实现思路
- 定义 API 对象,绑定组件 id
- 定义事件函数获取 API 对象的 方法
- video 组件绑定 bindplay 事件
- 实现功能后,重构代码。













