uni-app的<video />封装成组件后play、pause等API方式控制视频失效问题已解决

uni-app的

项目属性 版本号/方式
产品分类 uniapp/小程序/微信
PC开发环境操作系统 Mac
PC开发环境操作系统版本号 m1
第三方开发者工具版本号 2.0.0-31920210514002
基础库版本号 2.0.0-31920210514002
项目创建方式 CLI
CLI版本号 2.0.0-31920210514002

操作步骤:

  • 父级video的play()、pause()正常,组件的video不正常

预期结果:

  • 组件video的play()、pause()正常

实际结果:

  • 父级video的play()、pause()正常,组件的video不正常

bug描述:

已解决: uni.createVideoContext(videoId, this) 创建并返回 video 上下文 videoContext 对象。在自定义组件下,第二个参数传入组件实例this,以操作组件内 <video> 组件。

  • 以下原问题-

video组件放在页面中, this.videoContext.play()、 this.videoContext.pause()等api控制有效。 同样的代码包一层放入组件内,api控制失效

一级页面,控制有效

<template>  
  <view>  
    <video  
      id="myVideoOut"  
      src="https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/%E7%AC%AC1%E8%AE%B2%EF%BC%88uni-app%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC%89-%20DCloud%E5%AE%98%E6%96%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B@20200317.mp4"  
      controls  
      :direction="0"  
      object-fit="fill"  
      poster="http://wx.qlogo.cn/mmopen/iahdQicCC5VBSiaBc32cq9rHiaMAYsr2Y38TJrYrnyG1Xd9EaVoWAy8zMb8GJhMNEVtsypzuh5DicH3SfQWrEqYLtDNEzRq74uDTI/0"  
    />  
    <view @click="stopVideo">stop out</view>  
    <view @click="playVideo">play out</view>  
    <xxx />  
  </view>  
</template>  

<script>  
import xxx from './xxx';  
export default {  
  components: {  
    xxx,  
  },  
  methods: {  
    stopVideo() {  
      this.videoContext.pause();  
    },  
    playVideo() {  
      this.videoContext.play();  
    },  
  },  
  mounted() {  
    this.videoContext = uni.createVideoContext('myVideoOut');  
  },  
};  
</script>  

<style lang="scss"></style>  

xxx组件,和一级页面同样的代码,api控制失效

<template>  
  <view>  
    <video  
      id="myVideoIn"  
      src="https://img.cdn.aliyun.dcloud.net.cn/guide/uniapp/%E7%AC%AC1%E8%AE%B2%EF%BC%88uni-app%E4%BA%A7%E5%93%81%E4%BB%8B%E7%BB%8D%EF%BC%89-%20DCloud%E5%AE%98%E6%96%B9%E8%A7%86%E9%A2%91%E6%95%99%E7%A8%8B@20200317.mp4"  
      controls  
      :direction="0"  
      object-fit="fill"  
      poster="http://wx.qlogo.cn/mmopen/iahdQicCC5VBSiaBc32cq9rHiaMAYsr2Y38TJrYrnyG1Xd9EaVoWAy8zMb8GJhMNEVtsypzuh5DicH3SfQWrEqYLtDNEzRq74uDTI/0"  
    />  
    <view @click="stopVideo">stop in</view>  
    <view @click="playVideo">play in</view>  
  </view>  
</template>  

<script>  
export default {  
  methods: {  
    stopVideo() {  
      this.videoContext.pause();  
    },  
    playVideo() {  
      this.videoContext.play();  
    },  
  },  
  mounted() {  
    this.videoContext = uni.createVideoContext('myVideoIn');  
  },  
};  
</script>  

<style lang="scss"></style>  

更多关于uni-app的<video />封装成组件后play、pause等API方式控制视频失效问题已解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

使用 in 方法试试

更多关于uni-app的<video />封装成组件后play、pause等API方式控制视频失效问题已解决的实战教程也可以访问 https://www.itying.com/category-93-b0.html


什么in方法…

回复 a***@foxmail.com: 第二个参数传入组件实例,类似于其他 context 的 in 方法。这样:uni.createVideoContext(‘myVideoIn’, xxx);

回复 DCloud_UNI_GSQ: 修改组件内的视频 this.videoContext = uni.createVideoContext(‘myVideoIn’, this); 加了个this这样改ok了,谢谢

这是一个典型的自定义组件中获取视频上下文的问题。在uni-app中,当<video>组件位于自定义组件内时,uni.createVideoContext()需要传入第二个参数来指定组件实例。

在你的xxx组件中,应该这样修改:

mounted() {
  this.videoContext = uni.createVideoContext('myVideoIn', this);
}
回到顶部