带你读《2022技术人的百宝黑皮书》——短视频无尽流前端开发指南(2) https://developer.aliyun.com/article/1243501?groupCode=taobaotech
有两种情况会引起进度条“走动”:
1. 视频正常播放,进度更新。
2. 用户手动拖拽进度条。
对于1,进度条组件对父元素暴露更新进度的方法,父元素监听到播放器 timeupdate 时去调用该方法即可。
对于2,可以使用 @use-gesture/vanilla 实现跟手的拖拽效果,用户停止拖拽时去做播放器的跳帧操作:
// ... useEffect(() => { const gesture = new DragGesture( // 拖拽“点” thumbRef.current, (state) => { if (state.first) { setIsDragging(true); } const x = state.xy[0]; let walked: number; // 判断是否超出边界 if (x < 0) { walked = 0; } else if (x > OVERALL_WIDTH) { walked = OVERALL_WIDTH; } else { walked = x; } setCurrentWalked(walked); if (state.last) { // 用户停止拖拽后,跳帧至当前时间 const duration = Math.ceil((walked / OVERALL_WIDTH) * maxDuration); onChangeCurrentTime(duration); setIsDragging(false); } }, { axis: 'x', pointer: { touch: true }, }, ); return () => { gesture.destroy(); }; }, []); return ( <div ref={thumbRef} /> );
视频播放器激活及销毁
虽然该场景下存在n个内容卡片,但是我们只需要屏幕当中的那一个内容卡片渲染视频播放器,其余内容卡片仅保留封面图占位即可,减少内存占用。
带你读《2022技术人的百宝黑皮书》——短视频无尽流前端开发指南(4) https://developer.aliyun.com/article/1243498?groupCode=taobaotech