wd-video-preview.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <view :class="`wd-video-preview ${customClass}`" :style="customStyle" v-if="showPopup" @click="close">
  3. <view class="wd-video-preview__video" @click.stop="">
  4. <video
  5. class="wd-video-preview__video"
  6. v-if="previdewVideo.url"
  7. :controls="true"
  8. :poster="previdewVideo.poster"
  9. :title="previdewVideo.title"
  10. play-btn-position="center"
  11. :enableNative="true"
  12. :src="previdewVideo.url"
  13. :enable-progress-gesture="false"
  14. ></video>
  15. </view>
  16. <wd-icon name="close" :custom-class="`wd-video-preview__close`" @click="close" />
  17. </view>
  18. </template>
  19. <script lang="ts">
  20. export default {
  21. name: 'wd-video-preview',
  22. options: {
  23. addGlobalClass: true,
  24. virtualHost: true,
  25. styleIsolation: 'shared'
  26. }
  27. }
  28. </script>
  29. <script lang="ts" setup>
  30. import wdIcon from '../wd-icon/wd-icon.vue'
  31. import { nextTick, reactive, ref } from 'vue'
  32. import { videoPreviewProps, type PreviewVideo, type VideoPreviewExpose } from './types'
  33. import { useLockScroll } from '../composables/useLockScroll'
  34. defineProps(videoPreviewProps)
  35. const showPopup = ref<boolean>(false)
  36. const previdewVideo = reactive<PreviewVideo>({ url: '', poster: '', title: '' })
  37. function open(video: PreviewVideo) {
  38. showPopup.value = true
  39. previdewVideo.url = video.url
  40. previdewVideo.poster = video.poster
  41. previdewVideo.title = video.title
  42. }
  43. function close() {
  44. showPopup.value = false
  45. nextTick(() => {
  46. handleClosed()
  47. })
  48. }
  49. function handleClosed() {
  50. previdewVideo.url = ''
  51. previdewVideo.poster = ''
  52. previdewVideo.title = ''
  53. }
  54. // #ifdef H5
  55. useLockScroll(() => showPopup.value)
  56. // #endif
  57. defineExpose<VideoPreviewExpose>({
  58. open,
  59. close
  60. })
  61. </script>
  62. <style lang="scss" scoped>
  63. @import './index.scss';
  64. </style>