mor*_*ing 7 video html5-video svelte svelte-component svelte-3
在我的 Svelte 应用程序中,我有多个页面,每个页面显示一个或多个视频。为了渲染视频,我重用了视频组件(简化):
// video component
<video poster="{source.thumb}">
<source type="{source.mime}" src="{source.source}" >
</video>
Run Code Online (Sandbox Code Playgroud)
主页面通过api接收视频内容并调用视频组件:
// calling video component on main page
<script>
let source = {
thumb: 'thumb.jpg',
source: 'video.mp4',
mime: 'video/mp4',
};
</script>
<Video source={source} />
Run Code Online (Sandbox Code Playgroud)
一切正常,视频已渲染并可以播放。
但:当我导航或想要用另一个视频替换一个视频时,旧的视频元素以某种方式仍然存在并且播放继续。
我可以用来beforeUpdate()暂停视频。但随后,新视频奇怪地在完全相同的播放时间加载,一切都变得混乱。或者,如果我删除 中的视频元素beforeUpdate(),它不会填充新信息。
这有点道理,因为video媒体元素保持完全相同,而只有属性和内容发生变化。因此,状态和已经缓冲的源仍然存在。
我以某种方式需要确保,当数据发生变化时,视频组件必须完全重新安装。 有谁知道这是怎么做到的吗?谢谢!
要在源更改时触发视频的重新渲染,可以使用REPL块{#key}
<script>
export let source;
</script>
{#key source}
<video poster="{source.thumb}" controls>
<source type="{source.mime}" src="{source.source}" >
</video>
{/key}
Run Code Online (Sandbox Code Playgroud)
经过一番尝试和错误,在 @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}
Run Code Online (Sandbox Code Playgroud)
它检查视频 url 是否更改,如果更改,则触发reMountVideo().
| 归档时间: |
|
| 查看次数: |
3631 次 |
| 最近记录: |