You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue中vue-youtube-embed嵌套组件视频播放时暂停其他视频方案咨询

方案1:父组件作为调度中心(最适合当前场景,无需额外依赖)

你当前只有2个视频子组件,用父组件中转是成本最低的方案,逻辑也最清晰。

步骤1:修改父组件代码

给两个子组件加唯一ref,同时监听子组件抛出的播放事件:

<template>
  <div>
    <main class="main-content" id="main-content" tabindex="-1">
      <ResponsibilityByTheNumbers 
        is-video-component="true" 
        :text="handsOnText"
        ref="videoCompA"
        @video-play="pauseOtherVideo('videoCompB')"
      />   
      <ResponsibilityWhiteBandLeftText 
        is-video-component="true" 
        :showPrism="showPrism"
        :text="stemVideoBandText"
        ref="videoCompB"
        @video-play="pauseOtherVideo('videoCompA')"
      />
    </main>
  </div>
</template>

<script>
export default {
  methods: {
    pauseOtherVideo(targetCompRef) {
      // 调用目标子组件暴露的暂停方法
      this.$refs[targetCompRef]?.pauseVideo()
    }
  }
}
</script>

步骤2:修改两个视频子组件的代码

首先子组件内部监听youtube组件的播放事件,向外抛给父组件,同时对外暴露暂停自身视频的方法:

<!-- 子组件内的youtube组件 -->
<youtube 
  video-id="0md0uT_wg7g" 
  @playing="handlePlay"
  ref="innerPlayer"
></youtube>

<script>
export default {
  methods: {
    handlePlay() {
      // 播放时通知父组件
      this.$emit('video-play')
    },
    // 对外暴露的暂停方法
    pauseVideo() {
      this.$refs.innerPlayer?.player.stopVideo()
    }
  }
}
</script>

如果是Vue3项目,需要用defineExpose({ pauseVideo })把暂停方法暴露给父组件才能调用


常见问题解答

  • 能不能直接访问兄弟组件的$ref?
    不行,Vue的$ref是组件内部作用域的,兄弟组件无法直接互相访问。就算通过this.$parent.$refs.xxx的方式强行拿到,也会导致组件高度耦合,只要父组件结构稍有调整就会完全失效,非常不推荐。
  • 使用Store是不是更优的方案?
    如果你的项目里只有这两个视频需要联动控制,引入Pinia/Vuex反而增加冗余代码,父组件调度是最优解。如果你的全项目多处都有视频播放互斥的需求,用Store统一管理当前播放ID是更合适的方案:Store中存储当前播放的视频唯一标识,所有视频组件播放时更新Store中的ID,同时监听这个ID变化,当ID不等于自身ID时自动暂停即可。

内容的提问来源于stack exchange,提问作者hendy0817

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:54:00