swiper-slide.svelte 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <script>
  2. import { onMount, onDestroy, beforeUpdate, afterUpdate, setContext, getContext } from 'svelte';
  3. import { uniqueClasses } from './utils.js';
  4. export let zoom = undefined;
  5. export let virtualIndex = undefined;
  6. let className = undefined;
  7. export { className as class };
  8. let slideEl = null;
  9. let slideClasses = 'swiper-slide';
  10. let swiper = getContext('swiper');
  11. let eventAttached = false;
  12. const updateClasses = (_, el, classNames) => {
  13. if (el === slideEl) {
  14. slideClasses = classNames;
  15. }
  16. };
  17. const attachEvent = () => {
  18. if (!swiper || eventAttached) return;
  19. swiper.on('_slideClass', updateClasses);
  20. eventAttached = true;
  21. };
  22. const detachEvent = () => {
  23. if (!swiper) return;
  24. swiper.off('_slideClass', updateClasses);
  25. eventAttached = false;
  26. };
  27. $: slideData = {
  28. isActive:
  29. slideClasses.indexOf('swiper-slide-active') >= 0 ||
  30. slideClasses.indexOf('swiper-slide-duplicate-active') >= 0,
  31. isVisible: slideClasses.indexOf('swiper-slide-visible') >= 0,
  32. isDuplicate: slideClasses.indexOf('swiper-slide-duplicate') >= 0,
  33. isPrev:
  34. slideClasses.indexOf('swiper-slide-prev') >= 0 ||
  35. slideClasses.indexOf('swiper-slide-duplicate-prev') >= 0,
  36. isNext:
  37. slideClasses.indexOf('swiper-slide-next') >= 0 ||
  38. slideClasses.indexOf('swiper-slide-duplicate-next') >= 0,
  39. };
  40. onMount(() => {
  41. if (typeof virtualIndex === 'undefined') return;
  42. slideEl.onSwiper = (_swiper) => {
  43. swiper = _swiper;
  44. attachEvent();
  45. };
  46. attachEvent();
  47. });
  48. afterUpdate(() => {
  49. if (!slideEl || !swiper) return;
  50. if (swiper.destroyed) {
  51. if (slideClasses !== 'swiper-slide') {
  52. slideClasses = 'swiper-slide';
  53. }
  54. return;
  55. }
  56. attachEvent();
  57. });
  58. beforeUpdate(() => {
  59. attachEvent();
  60. });
  61. onDestroy(() => {
  62. if (!swiper) return;
  63. detachEvent();
  64. });
  65. </script>
  66. <div
  67. bind:this={slideEl}
  68. class={uniqueClasses(`${slideClasses}${className ? ` ${className}` : ''}`)}
  69. data-swiper-slide-index={virtualIndex}
  70. {...$$restProps}
  71. >
  72. {#if zoom}
  73. <div
  74. class="swiper-zoom-container"
  75. data-swiper-zoom={typeof zoom === 'number' ? zoom : undefined}
  76. >
  77. <slot data={slideData} />
  78. </div>
  79. {:else}
  80. <slot data={slideData} />
  81. {/if}
  82. </div>