Skip to content

Commit 4821008

Browse files
committed
fix(vue): dynamically enable/disable navigation/pagination/scrollbar
1 parent 47b638d commit 4821008

File tree

3 files changed

+54
-7
lines changed

3 files changed

+54
-7
lines changed

src/vue/get-params.js

+1
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ function getParams(obj = {}) {
3838

3939
['navigation', 'pagination', 'scrollbar'].forEach((key) => {
4040
if (params[key] === true) params[key] = {};
41+
if (params[key] === false) delete params[key];
4142
});
4243

4344
return { params, passedParams, rest };

src/vue/swiper.js

+10-1
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,16 @@ const Swiper = {
300300
swiperRef.value &&
301301
!swiperRef.value.destroyed
302302
) {
303-
updateSwiper(swiperRef.value, slidesRef.value, newPassedParams, changedParams);
303+
updateSwiper({
304+
swiper: swiperRef.value,
305+
slides: slidesRef.value,
306+
passedParams: newPassedParams,
307+
changedParams,
308+
nextEl: nextElRef.value,
309+
prevEl: prevElRef.value,
310+
scrollbarEl: scrollbarElRef.value,
311+
paginationEl: paginationElRef.value,
312+
});
304313
}
305314
breakpointChanged.value = false;
306315
});

src/vue/update-swiper.js

+43-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
import { isObject, extend } from './utils';
22

3-
function updateSwiper(swiper, slides, passedParams, changedParams) {
3+
function updateSwiper({
4+
swiper,
5+
slides,
6+
passedParams,
7+
changedParams,
8+
nextEl,
9+
prevEl,
10+
paginationEl,
11+
scrollbarEl,
12+
}) {
413
const updateParams = changedParams.filter((key) => key !== 'children' && key !== 'direction');
514
const { params: currentParams, pagination, navigation, scrollbar, virtual, thumbs } = swiper;
615
let needThumbsInit;
@@ -29,7 +38,7 @@ function updateSwiper(swiper, slides, passedParams, changedParams) {
2938
if (
3039
changedParams.includes('pagination') &&
3140
passedParams.pagination &&
32-
passedParams.pagination.el &&
41+
(passedParams.pagination.el || paginationEl) &&
3342
(currentParams.pagination || currentParams.pagination === false) &&
3443
pagination &&
3544
!pagination.el
@@ -40,7 +49,7 @@ function updateSwiper(swiper, slides, passedParams, changedParams) {
4049
if (
4150
changedParams.includes('scrollbar') &&
4251
passedParams.scrollbar &&
43-
passedParams.scrollbar.el &&
52+
(passedParams.scrollbar.el || scrollbarEl) &&
4453
(currentParams.scrollbar || currentParams.scrollbar === false) &&
4554
scrollbar &&
4655
!scrollbar.el
@@ -51,8 +60,8 @@ function updateSwiper(swiper, slides, passedParams, changedParams) {
5160
if (
5261
changedParams.includes('navigation') &&
5362
passedParams.navigation &&
54-
passedParams.navigation.prevEl &&
55-
passedParams.navigation.nextEl &&
63+
(passedParams.navigation.prevEl || prevEl) &&
64+
(passedParams.navigation.nextEl || nextEl) &&
5665
(currentParams.navigation || currentParams.navigation === false) &&
5766
navigation &&
5867
!navigation.prevEl &&
@@ -61,11 +70,35 @@ function updateSwiper(swiper, slides, passedParams, changedParams) {
6170
needNavigationInit = true;
6271
}
6372

73+
const destroyModule = (mod) => {
74+
if (!swiper[mod]) return;
75+
swiper[mod].destroy();
76+
if (mod === 'navigation') {
77+
currentParams[mod].prevEl = undefined;
78+
currentParams[mod].nextEl = undefined;
79+
swiper[mod].prevEl = undefined;
80+
swiper[mod].nextEl = undefined;
81+
} else {
82+
currentParams[mod].el = undefined;
83+
swiper[mod].el = undefined;
84+
}
85+
};
86+
6487
updateParams.forEach((key) => {
6588
if (isObject(currentParams[key]) && isObject(passedParams[key])) {
6689
extend(currentParams[key], passedParams[key]);
6790
} else {
68-
currentParams[key] = passedParams[key];
91+
const newValue = passedParams[key];
92+
if (
93+
(newValue === true || newValue === false) &&
94+
(key === 'navigation' || key === 'pagination' || key === 'scrollbar')
95+
) {
96+
if (newValue === false) {
97+
destroyModule(key);
98+
}
99+
} else {
100+
currentParams[key] = passedParams[key];
101+
}
69102
}
70103
});
71104

@@ -86,18 +119,22 @@ function updateSwiper(swiper, slides, passedParams, changedParams) {
86119
}
87120

88121
if (needPaginationInit) {
122+
if (paginationEl) currentParams.pagination.el = paginationEl;
89123
pagination.init();
90124
pagination.render();
91125
pagination.update();
92126
}
93127

94128
if (needScrollbarInit) {
129+
if (scrollbarEl) currentParams.scrollbar.el = scrollbarEl;
95130
scrollbar.init();
96131
scrollbar.updateSize();
97132
scrollbar.setTranslate();
98133
}
99134

100135
if (needNavigationInit) {
136+
if (nextEl) currentParams.navigation.nextEl = nextEl;
137+
if (prevEl) currentParams.navigation.prevEl = prevEl;
101138
navigation.init();
102139
navigation.update();
103140
}

0 commit comments

Comments
 (0)