watchEffect 无法同步多路视频画面,因其不处理 DOM 播放器状态与时间轴;真正同步依赖统一 masterTime 控制、CSS Grid 布局及防抖+标志位避免循环触发,跨端需服务端中继。
直接用 watchEffect 无法同步多路视频画面——它不处理 DOM 播放器状态,也不接管视频时间轴。真正起作用的是播放控制逻辑与布局渲染的分离:网格布局靠 CSS 实现,画面同步靠统一进度管理,watchEffect 只负责响应式联动其中一环。
九宫格或多格监控界面本质是容器内多个 <video> 元素的排列问题,和响应式监听无关:
display: grid 定义行列数,例如 grid-template-columns: repeat(3, 1fr) 实现三列均分<video> 设置 width: 100%; height: 100% 自适应单元格v-for 渲染视频列表,数据源(如摄像头地址数组)变化时,DOM 自动更新要让所有视频画面严格同步,关键不是监听某个变量,而是把播放器的 currentTime 当作受控状态来维护:
const masterTime = ref(0),作为所有视频的“主时间轴”<video> 绑定 @timeupdate 和 @seeked,读取当前值并更新 masterTime
watchEffect 监听 masterTime,批量设置各视频的 .currentTime
video.readyState >= 1,避免未加载就赋值报错用户拖拽一个视频进度条,会触发 timeupdate → 更新 masterTime → watchEffect 同步其他视频 → 其他视频也触发 timeupdate。这会导致连锁反应:
masterTime 前加标志位,如 isSyncing = true
if (isSyncing) return
watchEffect 内部同步完后重置标志位单页面内用 watchEffect 能协调多个 <video>,但若要手机、电脑、大屏三端同步:
watchEffect 不参与网络通信,只负责本地响应masterTime.value 到服务端masterTime,触发 watchEffect 执行同步