- 作者:老汪软件技巧
- 发表时间:2024-09-13 04:01
- 浏览量:
0、前情提要
为了解决下面这些问题,我考虑到抽出一个公共的Video组件,使其能在多端的效果一致
1、需求分析
综上所述,我们需要的Video需求如下
2、思考需求解决方案2.1、解决小程序单个页面渲染多个Video内存溢出2.2、实现ios和安卓的点击播放效果统一2.3、解决Taro.createVideoContext的实例方法无法控制h5的video2.4、样式不一致的问题3、思考组件的props需要什么4、编写CommonVideo组件
// ref 控制 h5 的播放暂停
const videoH5Ref = useRef(null)
// videoTaroPlayer 控制 Taro 的播放暂停
const videoTaroPlayer = Taro.createVideoContext(`videoTaroPlayer${id}`)
const commonVideoFullScreen = (video: HTMLVideoElement, pageEnv: PageEnv) => {
switch (pageEnv) {
case 'weapp':
videoTaroPlayer.requestFullScreen({ direction: 0 })
// 因为play的方法要等待视频资源加载完成才能拿到,默认等待0.5秒,防止用户一进来立刻点击大视频导致卡顿
delayOnVideoReady(videoTaroPlayer.play, 500)
break
case 'h5':
if (video.requestFullscreen) {
video.requestFullscreen()
video.addEventListener('loadedmetadata', () => {
video?.play()
})
}
break
default:
// 如果 pageEnv 不是 'weapp' 或 'h5',可以在这里处理默认情况
break
}
}
useLayoutEffect(() => {
const video: HTMLVideoElement = videoH5Ref.current!
const pageEnv: PageEnv = isWeapp ? 'weapp' : 'h5'
if (play) {
commonVideoFullScreen(video, pageEnv)
}
}, [play])
5、遇到的疑难杂症