index.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import { NModal } from 'naive-ui';
  2. import { defineComponent, toRef, watch } from 'vue';
  3. import styles from './index.module.less';
  4. import VideoModal from './video-modal';
  5. import MusicModal from './music-modal';
  6. import SongModal from './song-modal';
  7. import TheEmpty from '../TheEmpty';
  8. export default defineComponent({
  9. name: 'card-preview',
  10. props: {
  11. show: {
  12. type: Boolean,
  13. default: false
  14. },
  15. item: {
  16. type: Object,
  17. default: () => ({})
  18. }
  19. },
  20. emit: ['update:show'],
  21. setup(props, { emit }) {
  22. const show = toRef(props.show);
  23. const item = toRef(props.item);
  24. watch(
  25. () => props.show,
  26. () => {
  27. show.value = props.show;
  28. }
  29. );
  30. watch(
  31. () => props.item,
  32. () => {
  33. item.value = props.item;
  34. }
  35. );
  36. return () => (
  37. <>
  38. <NModal
  39. v-model:show={show.value}
  40. onUpdate:show={() => {
  41. emit('update:show', show.value);
  42. }}
  43. preset="card"
  44. showIcon={false}
  45. class={['modalTitle background', styles.cardPreview]}
  46. title={item.value.title}
  47. blockScroll={false}>
  48. {item.value.type === 'VIDEO' && (
  49. <VideoModal poster={item.value.url} src={item.value.content} />
  50. )}
  51. {item.value.type === 'MUSIC' && <MusicModal item={item.value} />}
  52. {item.value.type === 'SONG' && <SongModal item={item.value} />}
  53. {!['VIDEO', 'MUSIC', 'SONG'].includes(item.value.type) && (
  54. <TheEmpty />
  55. )}
  56. </NModal>
  57. </>
  58. );
  59. }
  60. });