swiper-slide.js 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { h, ref, onMounted, onUpdated, onBeforeUpdate, computed, onBeforeUnmount, provide } from 'vue';
  2. import { uniqueClasses } from './utils.js';
  3. const SwiperSlide = {
  4. name: 'SwiperSlide',
  5. props: {
  6. tag: {
  7. type: String,
  8. default: 'div'
  9. },
  10. swiperRef: {
  11. type: Object,
  12. required: false
  13. },
  14. zoom: {
  15. type: Boolean,
  16. default: undefined
  17. },
  18. virtualIndex: {
  19. type: [String, Number],
  20. default: undefined
  21. }
  22. },
  23. setup(props, _ref) {
  24. let {
  25. slots
  26. } = _ref;
  27. let eventAttached = false;
  28. const {
  29. swiperRef
  30. } = props;
  31. const slideElRef = ref(null);
  32. const slideClasses = ref('swiper-slide');
  33. function updateClasses(swiper, el, classNames) {
  34. if (el === slideElRef.value) {
  35. slideClasses.value = classNames;
  36. }
  37. }
  38. onMounted(() => {
  39. if (!swiperRef.value) return;
  40. swiperRef.value.on('_slideClass', updateClasses);
  41. eventAttached = true;
  42. });
  43. onBeforeUpdate(() => {
  44. if (eventAttached || !swiperRef || !swiperRef.value) return;
  45. swiperRef.value.on('_slideClass', updateClasses);
  46. eventAttached = true;
  47. });
  48. onUpdated(() => {
  49. if (!slideElRef.value || !swiperRef || !swiperRef.value) return;
  50. if (swiperRef.value.destroyed) {
  51. if (slideClasses.value !== 'swiper-slide') {
  52. slideClasses.value = 'swiper-slide';
  53. }
  54. }
  55. });
  56. onBeforeUnmount(() => {
  57. if (!swiperRef || !swiperRef.value) return;
  58. swiperRef.value.off('_slideClass', updateClasses);
  59. });
  60. const slideData = computed(() => ({
  61. isActive: slideClasses.value.indexOf('swiper-slide-active') >= 0 || slideClasses.value.indexOf('swiper-slide-duplicate-active') >= 0,
  62. isVisible: slideClasses.value.indexOf('swiper-slide-visible') >= 0,
  63. isDuplicate: slideClasses.value.indexOf('swiper-slide-duplicate') >= 0,
  64. isPrev: slideClasses.value.indexOf('swiper-slide-prev') >= 0 || slideClasses.value.indexOf('swiper-slide-duplicate-prev') >= 0,
  65. isNext: slideClasses.value.indexOf('swiper-slide-next') >= 0 || slideClasses.value.indexOf('swiper-slide-duplicate-next') >= 0
  66. }));
  67. provide('swiperSlide', slideData);
  68. return () => {
  69. return h(props.tag, {
  70. class: uniqueClasses(`${slideClasses.value}`),
  71. ref: slideElRef,
  72. 'data-swiper-slide-index': props.virtualIndex
  73. }, props.zoom ? h('div', {
  74. class: 'swiper-zoom-container',
  75. 'data-swiper-zoom': typeof props.zoom === 'number' ? props.zoom : undefined
  76. }, slots.default && slots.default(slideData.value)) : slots.default && slots.default(slideData.value));
  77. };
  78. }
  79. };
  80. export { SwiperSlide };