swiper-slide.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { template as _$template } from "solid-js/web";
  2. import { setAttribute as _$setAttribute } from "solid-js/web";
  3. import { effect as _$effect } from "solid-js/web";
  4. import { insert as _$insert } from "solid-js/web";
  5. import { mergeProps as _$mergeProps } from "solid-js/web";
  6. import { createComponent as _$createComponent } from "solid-js/web";
  7. import { memo as _$memo } from "solid-js/web";
  8. const _tmpl$ = /*#__PURE__*/_$template(`<div class="swiper-zoom-container"></div>`, 2);
  9. import { createEffect, createSignal, onCleanup, splitProps } from 'solid-js';
  10. import { Dynamic } from 'solid-js/web';
  11. import { SwiperSlideContext } from './context.js';
  12. import { uniqueClasses } from '../components-shared/utils.js';
  13. const SwiperSlide = props => {
  14. const [local, rest] = splitProps(props, ['children', 'class', 'ref', 'swiper', 'tag', 'virtualIndex', 'zoom']);
  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); // eslint-disable-next-line
  33. onCleanup(() => {
  34. if (!local.swiper) return;
  35. local.swiper.off('_slideClass', updateClasses);
  36. });
  37. });
  38. createEffect(() => {
  39. if (local.swiper && ref && !local.swiper.destroyed) {
  40. setSlideClasses(local.swiper.getSlideClasses(ref));
  41. }
  42. });
  43. const slideData = () => ({
  44. isActive: slideClasses().indexOf('swiper-slide-active') >= 0 || slideClasses().indexOf('swiper-slide-duplicate-active') >= 0,
  45. isVisible: slideClasses().indexOf('swiper-slide-visible') >= 0,
  46. isDuplicate: slideClasses().indexOf('swiper-slide-duplicate') >= 0,
  47. isPrev: slideClasses().indexOf('swiper-slide-prev') >= 0 || slideClasses().indexOf('swiper-slide-duplicate-prev') >= 0,
  48. isNext: slideClasses().indexOf('swiper-slide-next') >= 0 || slideClasses().indexOf('swiper-slide-duplicate-next') >= 0
  49. });
  50. const renderChildren = () => {
  51. return typeof local.children === 'function' ? local.children(slideData()) : local.children;
  52. };
  53. /* eslint-disable react/react-in-jsx-scope */
  54. /* eslint-disable react/no-unknown-property */
  55. return _$createComponent(Dynamic, _$mergeProps({
  56. get component() {
  57. return local.tag || 'div';
  58. },
  59. ref: el => {
  60. ref = el;
  61. if (typeof local.ref === 'function') {
  62. local.ref(el);
  63. } else {
  64. local.ref = el;
  65. }
  66. },
  67. get ["class"]() {
  68. return uniqueClasses(`${slideClasses()}${local.class ? ` ${local.class}` : ''}`);
  69. },
  70. get ["data-swiper-slide-index"]() {
  71. return local.virtualIndex;
  72. }
  73. }, rest, {
  74. get children() {
  75. return _$createComponent(SwiperSlideContext.Provider, {
  76. get value() {
  77. return slideData();
  78. },
  79. get children() {
  80. return _$memo(() => !!local.zoom, true)() ? (() => {
  81. const _el$ = _tmpl$.cloneNode(true);
  82. _$insert(_el$, renderChildren);
  83. _$effect(() => _$setAttribute(_el$, "data-swiper-zoom", typeof local.zoom === 'number' ? local.zoom : undefined));
  84. return _el$;
  85. })() : renderChildren();
  86. }
  87. });
  88. }
  89. }));
  90. };
  91. export { SwiperSlide };