ScreenElement.vue 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <template>
  2. <div
  3. class="screen-element"
  4. :style="{
  5. zIndex: elementIndex,
  6. visibility: needWaitAnimation ? 'hidden' : 'visible',
  7. }"
  8. >
  9. <component
  10. :is="currentElementComponent"
  11. :elementInfo="elementInfo"
  12. ></component>
  13. </div>
  14. </template>
  15. <script lang="ts">
  16. import { computed, defineComponent, PropType, Ref } from 'vue'
  17. import { useStore } from 'vuex'
  18. import { State } from '@/store'
  19. import { ElementTypes, PPTElement, Slide } from '@/types/slides'
  20. import BaseImageElement from '@/views/components/element/ImageElement/BaseImageElement.vue'
  21. import BaseTextElement from '@/views/components/element/TextElement/BaseTextElement.vue'
  22. import BaseShapeElement from '@/views/components/element/ShapeElement/BaseShapeElement.vue'
  23. import BaseLineElement from '@/views/components/element/LineElement/BaseLineElement.vue'
  24. import BaseChartElement from '@/views/components/element/ChartElement/BaseChartElement.vue'
  25. export default defineComponent({
  26. name: 'screen-element',
  27. props: {
  28. elementInfo: {
  29. type: Object as PropType<PPTElement>,
  30. required: true,
  31. },
  32. elementIndex: {
  33. type: Number,
  34. required: true,
  35. },
  36. animationIndex: {
  37. type: Number,
  38. default: -1,
  39. },
  40. },
  41. setup(props) {
  42. const currentElementComponent = computed(() => {
  43. const elementTypeMap = {
  44. [ElementTypes.IMAGE]: BaseImageElement,
  45. [ElementTypes.TEXT]: BaseTextElement,
  46. [ElementTypes.SHAPE]: BaseShapeElement,
  47. [ElementTypes.LINE]: BaseLineElement,
  48. [ElementTypes.CHART]: BaseChartElement,
  49. }
  50. return elementTypeMap[props.elementInfo.type] || null
  51. })
  52. const store = useStore<State>()
  53. const currentSlide: Ref<Slide> = computed(() => store.getters.currentSlide)
  54. const needWaitAnimation = computed(() => {
  55. const animations = currentSlide.value.animations || []
  56. const elementIndexInAnimation = animations.findIndex(animation => animation.elId === props.elementInfo.id)
  57. if(elementIndexInAnimation !== -1 && elementIndexInAnimation >= props.animationIndex) return true
  58. return false
  59. })
  60. return {
  61. currentElementComponent,
  62. needWaitAnimation,
  63. }
  64. },
  65. })
  66. </script>