Skip to content

Commit 6899e83

Browse files
committed
feat(core): convert Virtual to functional module
1 parent bea5ac2 commit 6899e83

File tree

1 file changed

+78
-82
lines changed

1 file changed

+78
-82
lines changed

src/modules/virtual/virtual.js

+78-82
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,51 @@
11
import $ from '../../shared/dom.js';
2-
import { extend, bindModuleMethods } from '../../shared/utils.js';
32

4-
const Virtual = {
5-
update(force) {
6-
const swiper = this;
3+
export default function Virtual({ swiper, extendParams, on }) {
4+
extendParams({
5+
virtual: {
6+
enabled: false,
7+
slides: [],
8+
cache: true,
9+
renderSlide: null,
10+
renderExternal: null,
11+
renderExternalUpdate: true,
12+
addSlidesBefore: 0,
13+
addSlidesAfter: 0,
14+
},
15+
});
16+
17+
swiper.virtual = {
18+
cache: {},
19+
from: null,
20+
to: null,
21+
slides: [],
22+
offset: 0,
23+
slidesGrid: [],
24+
};
25+
26+
function renderSlide(slide, index) {
27+
const params = swiper.params.virtual;
28+
if (params.cache && swiper.virtual.cache[index]) {
29+
return swiper.virtual.cache[index];
30+
}
31+
const $slideEl = params.renderSlide
32+
? $(params.renderSlide.call(swiper, slide, index))
33+
: $(
34+
`<div class="${swiper.params.slideClass}" data-swiper-slide-index="${index}">${slide}</div>`,
35+
);
36+
if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);
37+
if (params.cache) swiper.virtual.cache[index] = $slideEl;
38+
return $slideEl;
39+
}
40+
41+
function update(force) {
742
const { slidesPerView, slidesPerGroup, centeredSlides } = swiper.params;
843
const { addSlidesBefore, addSlidesAfter } = swiper.params.virtual;
944
const {
1045
from: previousFrom,
1146
to: previousTo,
1247
slides,
1348
slidesGrid: previousSlidesGrid,
14-
renderSlide,
1549
offset: previousOffset,
1650
} = swiper.virtual;
1751
swiper.updateActiveIndex();
@@ -34,7 +68,7 @@ const Virtual = {
3468
const to = Math.min((activeIndex || 0) + slidesAfter, slides.length - 1);
3569
const offset = (swiper.slidesGrid[from] || 0) - (swiper.slidesGrid[0] || 0);
3670

37-
extend(swiper.virtual, {
71+
Object.assign(swiper.virtual, {
3872
from,
3973
to,
4074
offset,
@@ -108,35 +142,19 @@ const Virtual = {
108142
});
109143
swiper.$wrapperEl.children('.swiper-slide').css(offsetProp, `${offset}px`);
110144
onRendered();
111-
},
112-
renderSlide(slide, index) {
113-
const swiper = this;
114-
const params = swiper.params.virtual;
115-
if (params.cache && swiper.virtual.cache[index]) {
116-
return swiper.virtual.cache[index];
117-
}
118-
const $slideEl = params.renderSlide
119-
? $(params.renderSlide.call(swiper, slide, index))
120-
: $(
121-
`<div class="${swiper.params.slideClass}" data-swiper-slide-index="${index}">${slide}</div>`,
122-
);
123-
if (!$slideEl.attr('data-swiper-slide-index')) $slideEl.attr('data-swiper-slide-index', index);
124-
if (params.cache) swiper.virtual.cache[index] = $slideEl;
125-
return $slideEl;
126-
},
127-
appendSlide(slides) {
128-
const swiper = this;
145+
}
146+
147+
function appendSlide(slides) {
129148
if (typeof slides === 'object' && 'length' in slides) {
130149
for (let i = 0; i < slides.length; i += 1) {
131150
if (slides[i]) swiper.virtual.slides.push(slides[i]);
132151
}
133152
} else {
134153
swiper.virtual.slides.push(slides);
135154
}
136-
swiper.virtual.update(true);
137-
},
138-
prependSlide(slides) {
139-
const swiper = this;
155+
update(true);
156+
}
157+
function prependSlide(slides) {
140158
const activeIndex = swiper.activeIndex;
141159
let newActiveIndex = activeIndex + 1;
142160
let numberOfNewSlides = 1;
@@ -163,11 +181,10 @@ const Virtual = {
163181
});
164182
swiper.virtual.cache = newCache;
165183
}
166-
swiper.virtual.update(true);
184+
update(true);
167185
swiper.slideTo(newActiveIndex, 0);
168-
},
169-
removeSlide(slidesIndexes) {
170-
const swiper = this;
186+
}
187+
function removeSlide(slidesIndexes) {
171188
if (typeof slidesIndexes === 'undefined' || slidesIndexes === null) return;
172189
let activeIndex = swiper.activeIndex;
173190
if (Array.isArray(slidesIndexes)) {
@@ -187,61 +204,40 @@ const Virtual = {
187204
if (slidesIndexes < activeIndex) activeIndex -= 1;
188205
activeIndex = Math.max(activeIndex, 0);
189206
}
190-
swiper.virtual.update(true);
207+
update(true);
191208
swiper.slideTo(activeIndex, 0);
192-
},
193-
removeAllSlides() {
194-
const swiper = this;
209+
}
210+
function removeAllSlides() {
195211
swiper.virtual.slides = [];
196212
if (swiper.params.virtual.cache) {
197213
swiper.virtual.cache = {};
198214
}
199-
swiper.virtual.update(true);
215+
update(true);
200216
swiper.slideTo(0, 0);
201-
},
202-
};
217+
}
203218

204-
export default {
205-
name: 'virtual',
206-
params: {
207-
virtual: {
208-
enabled: false,
209-
slides: [],
210-
cache: true,
211-
renderSlide: null,
212-
renderExternal: null,
213-
renderExternalUpdate: true,
214-
addSlidesBefore: 0,
215-
addSlidesAfter: 0,
216-
},
217-
},
218-
create() {
219-
const swiper = this;
220-
bindModuleMethods(swiper, {
221-
virtual: {
222-
...Virtual,
223-
slides: swiper.params.virtual.slides,
224-
cache: {},
225-
},
226-
});
227-
},
228-
on: {
229-
beforeInit(swiper) {
230-
if (!swiper.params.virtual.enabled) return;
231-
swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);
232-
const overwriteParams = {
233-
watchSlidesProgress: true,
234-
};
235-
extend(swiper.params, overwriteParams);
236-
extend(swiper.originalParams, overwriteParams);
219+
on('beforeInit', () => {
220+
if (!swiper.params.virtual.enabled) return;
221+
swiper.virtual.slides = swiper.params.virtual.slides;
222+
swiper.classNames.push(`${swiper.params.containerModifierClass}virtual`);
237223

238-
if (!swiper.params.initialSlide) {
239-
swiper.virtual.update();
240-
}
241-
},
242-
setTranslate(swiper) {
243-
if (!swiper.params.virtual.enabled) return;
244-
swiper.virtual.update();
245-
},
246-
},
247-
};
224+
swiper.params.watchSlidesProgress = true;
225+
swiper.originalParams.watchSlidesProgress = true;
226+
227+
if (!swiper.params.initialSlide) {
228+
update();
229+
}
230+
});
231+
on('setTranslate', () => {
232+
if (!swiper.params.virtual.enabled) return;
233+
update();
234+
});
235+
236+
Object.assign(swiper.virtual, {
237+
appendSlide,
238+
prependSlide,
239+
removeSlide,
240+
removeAllSlides,
241+
update,
242+
});
243+
}

0 commit comments

Comments
 (0)