1
1
import $ from '../../shared/dom.js' ;
2
- import { extend , bindModuleMethods } from '../../shared/utils.js' ;
3
2
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 ) {
7
42
const { slidesPerView, slidesPerGroup, centeredSlides } = swiper . params ;
8
43
const { addSlidesBefore, addSlidesAfter } = swiper . params . virtual ;
9
44
const {
10
45
from : previousFrom ,
11
46
to : previousTo ,
12
47
slides,
13
48
slidesGrid : previousSlidesGrid ,
14
- renderSlide,
15
49
offset : previousOffset ,
16
50
} = swiper . virtual ;
17
51
swiper . updateActiveIndex ( ) ;
@@ -34,7 +68,7 @@ const Virtual = {
34
68
const to = Math . min ( ( activeIndex || 0 ) + slidesAfter , slides . length - 1 ) ;
35
69
const offset = ( swiper . slidesGrid [ from ] || 0 ) - ( swiper . slidesGrid [ 0 ] || 0 ) ;
36
70
37
- extend ( swiper . virtual , {
71
+ Object . assign ( swiper . virtual , {
38
72
from,
39
73
to,
40
74
offset,
@@ -108,35 +142,19 @@ const Virtual = {
108
142
} ) ;
109
143
swiper . $wrapperEl . children ( '.swiper-slide' ) . css ( offsetProp , `${ offset } px` ) ;
110
144
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 ) {
129
148
if ( typeof slides === 'object' && 'length' in slides ) {
130
149
for ( let i = 0 ; i < slides . length ; i += 1 ) {
131
150
if ( slides [ i ] ) swiper . virtual . slides . push ( slides [ i ] ) ;
132
151
}
133
152
} else {
134
153
swiper . virtual . slides . push ( slides ) ;
135
154
}
136
- swiper . virtual . update ( true ) ;
137
- } ,
138
- prependSlide ( slides ) {
139
- const swiper = this ;
155
+ update ( true ) ;
156
+ }
157
+ function prependSlide ( slides ) {
140
158
const activeIndex = swiper . activeIndex ;
141
159
let newActiveIndex = activeIndex + 1 ;
142
160
let numberOfNewSlides = 1 ;
@@ -163,11 +181,10 @@ const Virtual = {
163
181
} ) ;
164
182
swiper . virtual . cache = newCache ;
165
183
}
166
- swiper . virtual . update ( true ) ;
184
+ update ( true ) ;
167
185
swiper . slideTo ( newActiveIndex , 0 ) ;
168
- } ,
169
- removeSlide ( slidesIndexes ) {
170
- const swiper = this ;
186
+ }
187
+ function removeSlide ( slidesIndexes ) {
171
188
if ( typeof slidesIndexes === 'undefined' || slidesIndexes === null ) return ;
172
189
let activeIndex = swiper . activeIndex ;
173
190
if ( Array . isArray ( slidesIndexes ) ) {
@@ -187,61 +204,40 @@ const Virtual = {
187
204
if ( slidesIndexes < activeIndex ) activeIndex -= 1 ;
188
205
activeIndex = Math . max ( activeIndex , 0 ) ;
189
206
}
190
- swiper . virtual . update ( true ) ;
207
+ update ( true ) ;
191
208
swiper . slideTo ( activeIndex , 0 ) ;
192
- } ,
193
- removeAllSlides ( ) {
194
- const swiper = this ;
209
+ }
210
+ function removeAllSlides ( ) {
195
211
swiper . virtual . slides = [ ] ;
196
212
if ( swiper . params . virtual . cache ) {
197
213
swiper . virtual . cache = { } ;
198
214
}
199
- swiper . virtual . update ( true ) ;
215
+ update ( true ) ;
200
216
swiper . slideTo ( 0 , 0 ) ;
201
- } ,
202
- } ;
217
+ }
203
218
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` ) ;
237
223
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