swiper-slide.jsx 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import { createEffect, createSignal, onCleanup, splitProps } from 'solid-js';
  2. import { Dynamic } from 'solid-js/web';
  3. import { SwiperSlideContext } from './context.js';
  4. import { uniqueClasses } from '../components-shared/utils.js';
  5. const SwiperSlide = (props) => {
  6. const [local, rest] = splitProps(props, [
  7. 'children',
  8. 'class',
  9. 'ref',
  10. 'swiper',
  11. 'tag',
  12. 'virtualIndex',
  13. 'zoom',
  14. ]);
  15. const [slideClasses, setSlideClasses] = createSignal('swiper-slide');
  16. let ref = null;
  17. function updateClasses(_s, el, classNames) {
  18. if (el === ref) {
  19. setSlideClasses(classNames);
  20. }
  21. }
  22. createEffect(() => {
  23. if (!ref || !local.swiper) {
  24. return;
  25. }
  26. if (local.swiper.destroyed) {
  27. if (slideClasses() !== 'swiper-slide') {
  28. setSlideClasses('swiper-slide');
  29. }
  30. return;
  31. }
  32. local.swiper.on('_slideClass', updateClasses);
  33. // eslint-disable-next-line
  34. onCleanup(() => {
  35. if (!local.swiper) return;
  36. local.swiper.off('_slideClass', updateClasses);
  37. });
  38. });
  39. createEffect(() => {
  40. if (local.swiper && ref && !local.swiper.destroyed) {
  41. setSlideClasses(local.swiper.getSlideClasses(ref));
  42. }
  43. });
  44. const slideData = () => ({
  45. isActive:
  46. slideClasses().indexOf('swiper-slide-active') >= 0 ||
  47. slideClasses().indexOf('swiper-slide-duplicate-active') >= 0,
  48. isVisible: slideClasses().indexOf('swiper-slide-visible') >= 0,
  49. isDuplicate: slideClasses().indexOf('swiper-slide-duplicate') >= 0,
  50. isPrev:
  51. slideClasses().indexOf('swiper-slide-prev') >= 0 ||
  52. slideClasses().indexOf('swiper-slide-duplicate-prev') >= 0,
  53. isNext:
  54. slideClasses().indexOf('swiper-slide-next') >= 0 ||
  55. slideClasses().indexOf('swiper-slide-duplicate-next') >= 0,
  56. });
  57. const renderChildren = () => {
  58. return typeof local.children === 'function' ? local.children(slideData()) : local.children;
  59. };
  60. /* eslint-disable react/react-in-jsx-scope */
  61. /* eslint-disable react/no-unknown-property */
  62. return (
  63. <Dynamic
  64. component={local.tag || 'div'}
  65. ref={(el) => {
  66. ref = el;
  67. if (typeof local.ref === 'function') {
  68. local.ref(el);
  69. } else {
  70. local.ref = el;
  71. }
  72. }}
  73. class={uniqueClasses(`${slideClasses()}${local.class ? ` ${local.class}` : ''}`)}
  74. data-swiper-slide-index={local.virtualIndex}
  75. {...rest}
  76. >
  77. <SwiperSlideContext.Provider value={slideData()}>
  78. {local.zoom ? (
  79. <div
  80. class="swiper-zoom-container"
  81. data-swiper-zoom={typeof local.zoom === 'number' ? local.zoom : undefined}
  82. >
  83. {renderChildren()}
  84. </div>
  85. ) : (
  86. renderChildren()
  87. )}
  88. </SwiperSlideContext.Provider>
  89. </Dynamic>
  90. );
  91. };
  92. export { SwiperSlide };