|
|
- <template>
- <uv-popup
- ref="videoModal"
- title="视频播放"
- :show-cancel-button="false"
- :show-confirm-button="false"
- :close-on-click-overlay="true"
- :safeAreaInsetBottom="false"
- @close="handleClose"
- >
- <template #default>
- <view class="video-container">
- <video
- v-if="currentVideo"
- :src="currentVideo"
- controls
- autoplay
- :show-fullscreen-btn="true"
- :show-play-btn="true"
- :show-center-play-btn="true"
- style="width: 100%; height: 400rpx; border-radius: 8rpx;"
- @error="onVideoError"
- @play="onVideoPlay"
- @pause="onVideoPause"
- ></video>
- <view v-else class="video-loading">
- <text>视频加载中...</text>
- </view>
- </view>
- </template>
- </uv-popup>
- </template>
-
- <script>
- export default {
- name: 'VideoPopup',
- data() {
- return {
- currentVideo: ''
- }
- },
- methods: {
- // 打开视频弹窗
- open(videoUrl) {
- if (videoUrl) {
- this.currentVideo = videoUrl
- this.$refs.videoModal.open()
- } else {
- uni.showToast({
- title: '视频地址无效',
- icon: 'error'
- })
- }
- },
-
- // 关闭视频弹窗
- close() {
- this.$refs.videoModal.close()
- this.currentVideo = ''
- },
-
- // 处理弹窗关闭事件
- handleClose() {
- this.currentVideo = ''
- this.$emit('close')
- },
-
- // 视频错误处理
- onVideoError(e) {
- console.error('视频播放错误:', e)
- uni.showToast({
- title: '视频播放失败',
- icon: 'error'
- })
- this.close()
- this.$emit('error', e)
- },
-
- // 视频开始播放
- onVideoPlay() {
- console.log('视频开始播放')
- this.$emit('play')
- },
-
- // 视频暂停
- onVideoPause() {
- console.log('视频暂停播放')
- this.$emit('pause')
- }
- }
- }
- </script>
-
- <style scoped lang="scss">
- .video-container {
- position: relative;
- width: 90vw;
-
- .video-loading {
- display: flex;
- align-items: center;
- justify-content: center;
- height: 400rpx;
- background: #f5f5f5;
- border-radius: 8rpx;
-
- text {
- font-size: 28rpx;
- color: #999;
- }
- }
- }
- </style>
|