更新记录
1.0.0(2026-06-26)
下载此版本
v1.0.0
重构(Breaking Changes)
- 从
jz-video-flow 重构为通用容器 jz-custom-flow
- 主容器 不再耦合任何内容形态,仅负责上下滑动手势、三槽位调度、切换动画、边界阻尼、触顶刷新、加载更多
- 内容完全由
default 插槽决定,作用域提供 item / index / isCurrent / isPrev / isNext / slotIndex
- 删除主容器全部视频 / 进度条相关 props 与事件:
auto / muted / objectFit / progress / showFullScreen / fullScreenText / showLoading / errorMessage / play / pause / waiting / ended / error / timeupdate / loadedmetadata / fullscreenchange / changing / changeed
- 删除主容器 ref 方法:
play / pause / seek / setPlaybackRate / pageShow / pageHide
- 新增 props:
disabled / horizontalRatio / bounce
- 新增 ref 方法:
next / prev / switchList(取代 switchEpisode)/ getCurrentItem
- 新增事件:
changeStart
新增组件
jz-flow-video — 视频 cell 子组件(替代旧 jz-video-player,更轻、active 驱动、内置 HLS / 单双击 / 进度条)
jz-flow-images — 左右轮播图集 cell 子组件,自带 update:lock 机制配合父级 disabled 避免手势冲突
升级
jz-progress-bar 新增 props:height / barColor / playedColor / bufferedColor / showTime,新增 change 事件(与 changeed 同义)
核心模块
- 新增
core/slot-pool.js(替代 core/video-pool.js,与内容形态无关的三槽位调度)
- 新增
core/hls-loader.js(H5 按需加载 hls.js,避免小程序 / nvue 打包错误)
core/swiper-controller.js 新增 horizontalRatio / bounce 配置
入口
index.js 默认导出 JzCustomFlow,具名导出 JzFlowVideo / JzFlowImages / JzProgressBar,未引用的子组件不会打包
平台兼容性
uni-app(4.45)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| × |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
jz-video-flow
抖音风格短视频滑动组件,支持上下滑动切换、三槽位渲染、HLS流媒体、进度条控制、自动连播、多端兼容

核心特性
| 特性 |
说明 |
| 上下滑动切换 |
流畅的手势交互,边界阻尼效果 |
| 三槽位渲染 |
仅渲染 prev/current/next 三个视频,优化性能 |
| HLS 流媒体 |
H5 平台自动集成 hls.js,支持 m3u8 格式 |
| 进度条控制 |
拖拽进度条跳转,实时显示缓冲进度 |
| 交互事件 |
单击、双击、长按、触顶下拉刷新 |
| 自动连播 |
视频播放完毕自动切换下一条 |
| 多端兼容 |
H5 / 微信小程序 / 支付小程序 / App-Vue / App-Nvue |
快速开始
1. 安装
将 jz-video-flow 目录置于项目的 src/uni_modules/ 下。
2. 组件注册
全局注册(推荐):
// main.js / App.vue
import JzVideoFlow from '@/uni_modules/jz-video-flow'
// Vue 3
app.component('JzVideoFlow', JzVideoFlow)
页面内注册:
<script setup>
import JzVideoFlow from '@/uni_modules/jz-video-flow'
</script>
3. 基础用法
<template>
<JzVideoFlow
ref="videoFlowRef"
:list="videoList"
:current="currentIndex"
:width="windowWidth"
:height="windowHeight"
:muted="false"
:auto="true"
:progress="true"
:upper-tip-message="下拉刷新"
@change="onVideoChange"
@loadmore="onLoadMore"
@refresh="onRefresh"
@click="onVideoClick"
@dblclick=""
@timeupdate=""
>
<!-- 默认插槽:覆盖层(视频信息、点赞按钮等) -->
<template #default="{ video, index }">
<view class="video-overlay">
<text class="video-title">{{ video.title }}</text>
</view>
</template>
</JzVideoFlow>
</template>
<script setup>
import { ref } from 'vue'
const videoList = ref([
{ src: 'https://example.com/video1.mp4', poster: '', title: '视频1' },
{ src: 'https://example.com/video2.m3u8', poster: '', title: '视频2' },
])
const currentIndex = ref(0)
function onVideoChange(ev) {
currentIndex.value = ev.detail.current
}
function onLoadMore(ev) {
// 加载更多视频
}
function onRefresh(ev) {
// 刷新视频列表
}
</script>
Props
| 属性 |
类型 |
默认值 |
说明 |
list |
Array |
[] |
视频列表,每项需包含 src、poster 等字段 |
current |
Number |
0 |
当前播放索引(支持 v-model:current) |
width |
Number |
375 / windowWidth |
容器宽度(px) |
height |
Number |
667 / windowHeight |
容器高度(px) |
duration |
Number |
200 |
切换动画时长(ms) |
criticalVal |
Number |
3 |
触发 loadmore 的剩余条数阈值 |
distance |
Number |
0.13 / 0.08 |
触发翻页的滑动比例 |
auto |
Boolean |
false / true |
播放完毕自动切换下一条 |
muted |
Boolean |
false |
是否静音 |
objectFit |
String |
'contain' |
视频填充模式(contain / cover) |
progress |
Boolean |
true |
是否显示进度条 |
showFullScreen |
Boolean |
true |
是否显示全屏按钮 |
fullScreenText |
String |
'全屏观看' |
全屏按钮文字 |
showLoading |
Boolean |
false |
是否显示加载动画 |
errorMessage |
String |
'无法加载此视频' |
视频加载失败提示 |
upperTipMessage |
String |
'' |
触顶下拉提示文字 |
Events
| 事件 |
参数 |
说明 |
update:current |
index |
当前索引变化(v-model) |
change |
{ detail: { item, current, direction } } |
视频切换完成 |
loadmore |
{ detail: { current, length, criticalVal } } |
接近底部,触发加载更多 |
refresh |
{ detail: { current } } |
触顶下拉刷新 |
click |
{ detail: { item, current, playing } } |
单击视频区域 |
dblclick |
{ detail: { item, current } } |
双击视频区域 |
longTap |
{ detail: { item, current } } |
长按视频区域 |
play |
Event |
视频开始播放 |
pause |
Event |
视频暂停 |
ended |
Event |
视频播放结束 |
waiting |
Event |
视频等待缓冲 |
error |
Event |
视频加载错误 |
timeupdate |
{ currentTime, duration, buffered } |
播放进度更新 |
loadedmetadata |
{ duration } |
视频元数据加载完成 |
fullscreenchange |
{ detail: { fullScreen, current } } |
全屏状态变化 |
changing |
{ currentTime, duration } |
进度条拖拽中 |
changeed |
{ currentTime, duration } |
进度条拖拽完成 |
Slots
| 插槽 |
参数 |
说明 |
default |
{ video, index, styles } |
视频覆盖层(视频信息、交互按钮等) |
video |
{ video, index } |
自定义视频播放器(完全替换默认播放器) |
progressBar |
{ video, index, currentTime, duration } |
自定义进度条 |
方法(通过 ref 调用)
| 方法 |
说明 |
play() |
播放当前视频 |
pause() |
暂停当前视频 |
seek(time) |
跳转到指定时间(秒) |
setCurrent(index) |
切换到指定索引 |
switchEpisode(list, index) |
切换剧集(新列表 + 起始索引) |
setPlaybackRate(rate) |
设置播放速率 |
pageShow() |
页面显示时恢复播放 |
pageHide() |
页面隐藏时暂停 |
目录结构
src/uni_modules/jz-video-flow/
├── package.json # 插件配置
├── readme.md # 说明文档
├── changelog.md # 更新日志
├── index.js # 主入口
├── components/ # 组件目录
│ ├── jz-video-flow.vue # H5 / 小程序 主组件
│ ├── jz-video-flow.nvue # App-Nvue 主组件
│ ├── jz-video-player.vue # 视频播放器(H5/小程序)
│ ├── jz-video-player.nvue # 视频播放器(Nvue)
│ ├── jz-progress-bar.vue # 进度条(H5/小程序)
│ └── jz-progress-bar.nvue # 进度条(Nvue)
└── core/ # 核心模块
├── video-pool.js # 三槽位调度器
├── swiper-controller.js # 滑动状态机
└── utils.js # 工具函数
注意事项
HLS 支持
- H5 平台自动集成
hls.js,支持 m3u8 格式
- 小程序原生支持 HLS(微信/支付宝等)
- App-Nvue 需确保视频格式兼容
自动播放限制
- H5 平台受浏览器自动播放政策限制,首次需静音或用户交互
- 建议初始设置
muted: true,用户点击后取消静音
nvue 特殊处理
- nvue 使用
weex.requireModule('animation') 实现切换动画
- nvue 不支持
transition CSS 属性,需用 animation 模块
- nvue 进度条事件需阻止冒泡(
@touchstart.stop)
许可证
MIT License
相关文档