在我的Svelte应用程序中,我有多个页面,每个页面显示一个或多个视频。 为了渲染视频,我重用了视频组件(简体):
// video component
<video poster="{source.thumb}">
<source type="{source.mime}" src="{source.source}" >
</video>
主页通过api接收视频内容并调用视频组件:
// calling video component on main page
<script>
let source = {
thumb: 'thumb.jpg',
source: 'video.mp4',
mime: 'video/mp4',
};
</script>
<Video source={source} />
一切正常,视频已渲染并可以播放。
但是:当我导航或想用另一个视频替换视频时,旧的视频元素仍然存在并且可以继续播放。
我可以使用beforeUpdate()
暂停视频。但是,然后,新视频在完全相同的播放时间奇怪地加载了,一切都变得混乱了。或者,如果我删除了beforeUpdate()
中的video元素,则它不会充满新信息。
这很有道理,因为video
媒体元素保持完全相同,而仅属性和内容发生了变化。因此,状态和已经缓冲的源保持不变。
我需要以某种方式确保当数据更改时,必须完全重新安装视频组件。 有谁知道这是怎么做到的吗?谢谢!
答案 0 :(得分:0)
我对<input type="file" ....>
遇到同样的问题
并使用以下方法解决了该问题:
let video = true:
function reMountVideo() {
video = false;
setTimeout(() => video = true, 0);
}
{#if video }
<Video source={source} />
{/if}
我没有尝试$destroy
答案 1 :(得分:0)
经过反复试验并在@voscausa的帮助下,它现在可以工作:
<script>
export let source;
let renderVideo = true;
$: { reMountVideo( source.source ) }
function reMountVideo(){
renderVideo = false;
setTimeout(() => renderVideo = true, 0);
}
</script>
{#if renderVideo === true}
<video poster="{source.thumb}">
<source type="{source.mime}" src="{source.source}" >
</video>
{/if}
它检查视频URL是否更改,如果更改,则触发reMountVideo()
。