Skip to content

Commit

Permalink
fix(react): make events reactive
Browse files Browse the repository at this point in the history
fixes #3762
  • Loading branch information
nolimits4web committed Apr 23, 2021
1 parent 1591fcf commit 301ffb0
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 3 deletions.
5 changes: 3 additions & 2 deletions src/react/get-params.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ function getParams(obj = {}) {
const params = {
on: {},
};
const events = {};
const passedParams = {};
extend(params, Swiper.defaults);
extend(params, Swiper.extendedDefaults);
Expand All @@ -27,7 +28,7 @@ function getParams(obj = {}) {
passedParams[key] = obj[key];
}
} else if (key.search(/on[A-Z]/) === 0 && typeof obj[key] === 'function') {
params.on[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];
events[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];
} else {
rest[key] = obj[key];
}
Expand All @@ -36,7 +37,7 @@ function getParams(obj = {}) {
if (params[key] === true) params[key] = {};
});

return { params, passedParams, rest };
return { params, passedParams, rest, events };
}

export { getParams };
24 changes: 23 additions & 1 deletion src/react/swiper.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ const Swiper = forwardRef(
} = {},
externalElRef,
) => {
let eventsAssigned = false;
const [containerClasses, setContainerClasses] = useState('swiper-container');
const [virtualData, setVirtualData] = useState(null);
const [breakpointChanged, setBreakpointChanged] = useState(false);
Expand All @@ -35,7 +36,7 @@ const Swiper = forwardRef(
const paginationElRef = useRef(null);
const scrollbarElRef = useRef(null);

const { params: swiperParams, passedParams, rest: restProps } = getParams(rest);
const { params: swiperParams, passedParams, rest: restProps, events } = getParams(rest);

const { slides, slots } = getChildren(children);

Expand All @@ -51,6 +52,8 @@ const Swiper = forwardRef(

if (!swiperElRef.current) {
// init swiper
Object.assign(swiperParams.on, events);
eventsAssigned = true;
swiperRef.current = initSwiper(swiperParams);
swiperRef.current.loopCreate = () => {};
swiperRef.current.loopDestroy = () => {};
Expand All @@ -73,6 +76,21 @@ const Swiper = forwardRef(
if (swiperRef.current) {
swiperRef.current.on('_beforeBreakpoint', onBeforeBreakpoint);
}

const attachEvents = () => {
if (eventsAssigned || !events || !swiperRef.current) return;
Object.keys(events).forEach((eventName) => {
swiperRef.current.on(eventName, events[eventName]);
});
};

const detachEvents = () => {
if (!events || !swiperRef.current) return;
Object.keys(events).forEach((eventName) => {
swiperRef.current.off(eventName, events[eventName]);
});
};

useEffect(() => {
return () => {
if (swiperRef.current) swiperRef.current.off('_beforeBreakpoint', onBeforeBreakpoint);
Expand Down Expand Up @@ -117,6 +135,7 @@ const Swiper = forwardRef(

// watch for params change
useIsomorphicLayoutEffect(() => {
attachEvents();
const changedParams = getChangedParams(
passedParams,
oldPassedParamsRef.current,
Expand All @@ -128,6 +147,9 @@ const Swiper = forwardRef(
if (changedParams.length && swiperRef.current && !swiperRef.current.destroyed) {
updateSwiper(swiperRef.current, slides, passedParams, changedParams);
}
return () => {
detachEvents();
};
});

// update on virtual update
Expand Down

0 comments on commit 301ffb0

Please sign in to comment.