我有一个包含几个CustomVideo
组件的根实例(在其他组件中)。 CustomVideo
组件实现了VideoJS,但是并不是在所有页面上都有CustomVideo
组件,因此我不想在全球范围内导入VideoJS。这是页面上组件的示例:
App.js
|
|-- CustomVideo
|-- FooComponent
|-- CustomVideo
|-- BarComponent
|-- CustomVideo
在CustomVideo顶部,导入VideoJS,如下所示:
import videojs from 'video.js';
import abLoopPlugin from 'videojs-abloop'
export default {
name: "FeaturedVideoPlayer",
props: {
videoUrl: String
}
mounted() {
let videoOptions = {
sources: [
{
src: this.videoUrl,
type: "video/mp4"
}
],
plugins: {
abLoopPlugin: {
'enabled': true
}
}
};
this.player = videojs(this.$refs.featuredVideoPlayer, videoOptions, function onPlayerReady() {});
}
但是如果有多个CustomVideo
,则会收到控制台警告:
视频:警告:已经存在一个名为“ abLoopPlugin”的插件。您可能要避免重新注册插件!
我尝试研究条件导入,但似乎不是这样做的方法。
即使我尝试将其导入app.js
,即使我更愿意将其导入CustomVideo
,也会出现另一个控制台错误:
尝试
import abLoopPlugin from 'videojs-abloop'
Vue.use( abLoopPlugin );
然后我得到了错误:
未捕获的TypeError:无法读取未定义的属性'registerPlugin'
如何确保插件仅注册一次?
答案 0 :(得分:1)
videojs.getPlugins().abLoopPlugin
videojs.getPlugins()
返回所有已加载插件名称的符号表。您可以简单地检查abLoopPlugin
不在该表中,然后再将其加载到组件中:
import videojs from 'video.js'
if (!videojs.getPlugins().abLoopPlugin) {
abLoopPlugin(window, videojs)
}
$nextTick
之前等待ref
您会注意到,您的视频最初在您指定的<video>
元素中不可见。这是因为将ref
传递给videojs
中的mounted()
时未定义。
ref
docs状态:
关于ref注册时间的重要说明:由于ref本身是通过render函数创建的,因此您无法在初始渲染时访问它们-它们尚不存在!
解决方案是等到$nextTick()
:
async mounted() {
// this.$refs.featuredVideoPlayer is undefined here
await this.$nextTick()
// this.$refs.featuredVideoPlayer is the <video> here
this.player = videojs(this.$refs.featuredVideoPlayer)
}
答案 1 :(得分:0)
尝试创建abLoopPlugin的实例。对于vue-i18n和其他插件,我遵循相同的方法在全球范围内使用。像这样:
import AbLoopPlugin from 'videojs-abloop'
Vue.use(AbLoopPlugin) // CHECK IF REGISTER PLUGIN ERROR PERSIST
const abLoopPlugin = new AbLoopPlugin({
---your settings---
})
export default abLoopPlugin