pptList.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { defineComponent, ref, onMounted, onUnmounted } from 'vue';
  2. import styles from './pptList.module.less';
  3. import { vaildPPTUrl } from '/src/utils/urlUtils';
  4. import { useUserStore } from '/src/store/modules/users';
  5. export default defineComponent({
  6. name: 'pptList',
  7. props: {
  8. pptData: {
  9. type: Object,
  10. default: () => ({})
  11. },
  12. fromType: {
  13. type: String, // 'PLATFORM' | 'TEACHER' | 'CLASS'
  14. default: 'TEACHER'
  15. }
  16. },
  17. emits: ['initPPT', 'changeSlideIndex', 'init'],
  18. setup(props, { emit, expose }) {
  19. const userStore = useUserStore();
  20. const iframeRef = ref<HTMLIFrameElement>();
  21. const src = `${vaildPPTUrl()}/#/pptScreen?id=${
  22. props.pptData.id
  23. }&Authorization=${userStore.getToken}&hideFullScreen=true&fromType=${
  24. props.fromType
  25. }`;
  26. // 上一页下一页
  27. function handleChangeSlide(type: 'prev' | 'next') {
  28. iframeRef.value?.contentWindow?.postMessage(
  29. { type: 'changePageSlide', content: type },
  30. '*'
  31. );
  32. }
  33. function handleMessage(event: any) {
  34. const { type, content } = event.data || {};
  35. console.log(content, 'message');
  36. if (type === 'initPPT') {
  37. emit('initPPT', content);
  38. } else if (type === 'changeSlideIndex') {
  39. emit('changeSlideIndex', content);
  40. }
  41. }
  42. emit('init');
  43. onMounted(() => {
  44. window.addEventListener('message', handleMessage);
  45. });
  46. onUnmounted(() => {
  47. window.removeEventListener('message', handleMessage);
  48. });
  49. expose({
  50. handleChangeSlide
  51. });
  52. return () => (
  53. <div class={styles.pptList}>
  54. <iframe
  55. ref={iframeRef}
  56. class={[styles.container]}
  57. frameborder="0"
  58. src={src}></iframe>
  59. </div>
  60. );
  61. }
  62. });