评论

video-swiper-短视频轮播,解决方案及部分思路

这篇文章现在只解决有限的视频轮播,如果需要动态加载视频,评论区讨论,或者需要我可以继续去研究研究,在合并到现在的代码片段里面,感谢。

这是一个官方的组件,但是不符合自己业务逻辑,几经修改,勉强适合使用。

本插件适合有限视频轮播,先说说组件思路:

1、组件是使用微信组件swiper来做动画切换;

2、video标签,官方提示尽量不要超过3个标签(同一个界面),虽然我不知道为什么,但是肯定和性能有关;

链接地址:https://developers.weixin.qq.com/community/develop/doc/000e4ef22583d8961919efb6b56009

3、视频轮播逻辑规律是:组件是使用三个swiper-item一直做无限滚动(好处就是不会造成过多的节点,性能好),看图:图的意思是滑动轮播的规律:箭头表示当前swiper滑动的位置,然后显示对应的视频,这样轮动排放的逻辑可以知道进可攻,退可守,不会出现上下滑播放顺序就乱了。

图片我们也可以发现,当视频数量刚好是3的倍数,不会有任何排放问题,但是如果是3的余数是1或者2时,那就出坑了,因为轮播swrper-item是固定三个的,所以修改的组件就是解决这个余数问题。

解决的思路是:当余数为1时,我们把当前swiper-item轮播变成4个轮播,当余数为2时,我们把当前swiper-item轮播变成2个轮播;这样就可以解决余数不为0的时候,但是有个特殊情况就是当视频刚好4个,应该直接全部swiper-item展示,无需其它逻辑处理。

// 下面的代码是官方没有的,自增核心代码
// 手势向上时处理逻辑
if ((total % 3) === 1 && nextQueue.length === 0) {
  let timers = new Date();
  let addItem = JSON.parse(JSON.stringify(add));
  addItem.idxKey = timers.getTime();
  curQueue[3] = addItem;
} else if ((total % 3) === 2 && nextQueue.length === 0) {
  let _pop = curQueue.pop();
  this.setData({
      _pop: _pop
  })
}
// 手势向下时处理逻辑
if ((total % 3) === 1 && curQueue.length === 4) {
  curQueue.pop();
} else if ((total % 3) === 2 && nextQueue.length === 0) {
  curQueue.push(this.data._pop);
}

这里有个坑就是视频自动播放,如果元素有两个渲染key是相同时,会造成视频点击两次才能播放;出现此问题主要发生在总数余1时会出现(即总是大于4以上,且总数余1,时,swiper-item出现四个时候会渲染两个相同的视频,导致key渲染相同)。

解决此问题:主要保证渲染的key是唯一的即可;

if ((total % 3) === 1 && nextQueue.length === 0) {
  let timers = new Date();
  let addItem = JSON.parse(JSON.stringify(add));
  addItem.idxKey = timers.getTime(); // 此语句就是保证添加四个swiper-item时,key是不同的
  curQueue[3] = addItem;
  } else if ((total % 3) === 2 && nextQueue.length === 0) {
     let _pop = curQueue.pop();
     this.setData({
      _pop: _pop
      })
}


如果不能理解我讲的,请下载测试代码片段自己测试并验证,有问题可以评论留意,相互学习。(使用在小程序名称为:iTOP-智能名片,需要进去后左滑,进入视频专辑,随便点击一个视频查看即可查看视频滑动效果)

这里的部分核心代码参考此文章(有修改点):https://developers.weixin.qq.com/community/develop/article/doc/0006ecd75fce608033ba9348d51413

官方源码组件地址(没修改过的代码):https://developers.weixin.qq.com/miniprogram/dev/extended/component-plus/video-swiper.html

本文章的代码片段:https://developers.weixin.qq.com/s/1M3qTFmg7ZmA

最后一次编辑于  2020-12-17  
点赞 8
收藏
评论

8 个评论

  • Arvin
    Arvin
    2022-07-13

    大佬,有没有uniapp 版本的解決方案

    2022-07-13
    赞同 1
    回复 4
  • Joker
    Joker
    08-30

    开始定位到0或者>6的序号时,会导致diff=0 下滑加载视频失败

    08-30
    赞同
    回复
  • 城南有少年
    城南有少年
    03-30

    请问下,为什么有的时候会触发两次play方法

    03-30
    赞同
    回复
  • yetherine
    yetherine
    03-27

    想请问下数据切换放到bindanimationfinish跟bindchange有什么区别么


    03-27
    赞同
    回复
  • 阿贾(沈)
    阿贾(沈)
    2023-05-26

    初始视频数量为5,8时,且初始播放的视频为4,7时,上滑不了视频。下滑到5,8后在上滑,正常。只在第一次加载的时候出现这个BUG。

    另外看到有人说滑动太快的时候会出现播放的视频顺序会错,主要是animationfinish动画来不及触发造成的,设置duration的值,能改善这个情况,但也不是完全解决了这个问题。我是把 这个动画时长的初始500改成了150。

    2023-05-26
    赞同
    回复 1
    • 哈罗哈皮
      哈罗哈皮
      2023-06-07
      好的,我看看
      2023-06-07
      回复
  • 好命先生
    好命先生
    2022-08-11

    大佬,现在有最新版本的代码片段吗?

    2022-08-11
    赞同
    回复 4
    • 哈罗哈皮
      哈罗哈皮
      发表于小程序端
      2022-08-11

      没有,我现在转Uniapp开发了

      2022-08-11
      回复
    • 好命先生
      好命先生
      2022-08-12回复哈罗哈皮
      大佬,uni-app的源码可以发过来看看?ts版本还是?
      2022-08-12
      回复
    • 哈罗哈皮
      哈罗哈皮
      2022-08-12回复好命先生
      uniapp用的是别人插件,没有自己写了,js版本
      2022-08-12
      回复
    • 好命先生
      好命先生
      2022-08-12回复哈罗哈皮
      你用的uni-app版本能分享下吗?
      2022-08-12
      回复
  • Duan
    Duan
    2022-07-12

    你好 如果是五个的话 第五个往上滑 就会出现bug 第三个增加到第五个后面了 这个有解决吗

    2022-07-12
    赞同
    回复 2
    • 哈罗哈皮
      哈罗哈皮
      2022-07-13
      这个可能是滑的太快导致的,周末修复下哈
      2022-07-13
      回复
    • 好命先生
      好命先生
      2022-08-12回复哈罗哈皮
      兄弟,这个问题解决了吗?
      2022-08-12
      回复
  • 如果🎈
    如果🎈
    2021-01-06

    如果初始的时候 是从第5个进入页面的话, 有办法解决吗?我们还需要动态加载视频, 能帮忙看下怎么解决吗?

    2021-01-06
    赞同
    回复 3
    • 哈罗哈皮
      哈罗哈皮
      2021-01-08
      有,思路就是要控制好初始值
                      _last: 1,
                      _change: -1,
                      _invalidUp: 0,
                      _invalidDown: 0,
                      nextQueue: [],
                      prevQueue: [],
                      curQueue: [],
      使用nextQueue: []来判断接下来还有多少视频,接近最后三个左右,调用接口获取视频内容push进nexQueue数组;
      2021-01-08
      回复
    • 一暮温暖╯
      一暮温暖╯
      2021-03-29回复哈罗哈皮
      大哥,完善下动态加载视频的逻辑可以吗?
      2021-03-29
      回复
    • 哈罗哈皮
      哈罗哈皮
      2021-04-12回复一暮温暖╯
      https://developers.weixin.qq.com/community/develop/article/doc/0000ea2e62c96070cafbcccdd51413
      更新动态加载逻辑了,欢迎查看讨论
      2021-04-12
      回复
登录 后发表内容