Skip to content

Commit 2e2922e

Browse files
committed
fix: Properly clear event listeners on component unmounts (#302)
1 parent efcecf3 commit 2e2922e

File tree

5 files changed

+29
-17
lines changed

5 files changed

+29
-17
lines changed

src/VueDatePicker/VueDatePicker.vue

+1
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,7 @@
447447
}
448448
clearInternalValues();
449449
emit('blur');
450+
dpMenuRef.value?.$el?.remove();
450451
}
451452
};
452453

src/VueDatePicker/components/ActionRow.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
</template>
6969

7070
<script lang="ts" setup>
71-
import { computed, onMounted, onUnmounted, ref } from 'vue';
71+
import { computed, onUnmounted, onMounted, ref } from 'vue';
7272
7373
import { checkKeyDown, convertType, unrefElement } from '@/utils/util';
7474
import { useArrowNavigation, useDefaults, useValidation } from '@/composables';

src/VueDatePicker/components/DatePicker/DpCalendar.vue

+10-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
</template>
115115

116116
<script lang="ts" setup>
117-
import { computed, nextTick, onMounted, ref } from 'vue';
117+
import { computed, nextTick, onUnmounted, onMounted, ref } from 'vue';
118118
import { getISOWeek, getWeek } from 'date-fns';
119119
120120
import {
@@ -216,6 +216,15 @@
216216
}
217217
});
218218
219+
onUnmounted(() => {
220+
if (calendarWrapRef.value) {
221+
calendarWrapRef.value.removeEventListener('touchstart', onTouchStart);
222+
calendarWrapRef.value.removeEventListener('touchend', onTouchEnd);
223+
calendarWrapRef.value.removeEventListener('touchmove', onTouchMove);
224+
calendarWrapRef.value.removeEventListener('wheel', onScroll);
225+
}
226+
});
227+
219228
const getTransitionName = (isNext: boolean) => {
220229
if (isNext) return props.vertical ? 'vNext' : 'next';
221230
return props.vertical ? 'vPrevious' : 'previous';

src/VueDatePicker/components/DatepickerMenu.vue

+16-14
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@
120120
</template>
121121

122122
<script lang="ts" setup>
123-
import { computed, onMounted, onUnmounted, ref, toValue, useSlots } from 'vue';
123+
import { computed, onUnmounted, onMounted, ref, toValue, useSlots } from 'vue';
124124
125125
import ActionRow from '@/components/ActionRow.vue';
126126
@@ -205,35 +205,37 @@
205205
const dynCmpRef = ref<any>(null);
206206
const isMenuActive = ref(false);
207207
208+
const stopDefault = (event: Event) => {
209+
isMenuActive.value = true;
210+
if (defaultedConfig.value.allowPreventDefault) {
211+
event.preventDefault();
212+
}
213+
checkStopPropagation(event, defaultedConfig.value, true);
214+
};
215+
208216
onMounted(() => {
209217
if (!props.shadow) {
210218
menuMount.value = true;
211219
getCalendarWidth();
212220
window.addEventListener('resize', getCalendarWidth);
213221
214-
const menu = unrefElement(dpMenuRef);
215-
if (menu && !defaultedTextInput.value.enabled && !defaultedInline.value.enabled) {
222+
if (dpMenuRef.value && !defaultedTextInput.value.enabled && !defaultedInline.value.enabled) {
216223
setMenuFocused(true);
217224
focusMenu();
218225
}
219-
if (menu) {
220-
const stopDefault = (event: Event) => {
221-
isMenuActive.value = true;
222-
if (defaultedConfig.value.allowPreventDefault) {
223-
event.preventDefault();
224-
}
225-
checkStopPropagation(event, defaultedConfig.value, true);
226-
};
227-
menu.addEventListener('pointerdown', stopDefault);
228-
menu.addEventListener('mousedown', stopDefault);
226+
if (dpMenuRef.value) {
227+
dpMenuRef.value.addEventListener('pointerdown', stopDefault);
228+
dpMenuRef.value.addEventListener('mousedown', stopDefault);
229229
}
230230
}
231231
document.addEventListener('mousedown', handleClickOutside);
232232
});
233233
234234
onUnmounted(() => {
235235
window.removeEventListener('resize', getCalendarWidth);
236-
document.addEventListener('mousedown', handleClickOutside);
236+
document.removeEventListener('mousedown', handleClickOutside);
237+
dpMenuRef.value?.removeEventListener('pointerdown', stopDefault);
238+
dpMenuRef.value?.removeEventListener('mousedown', stopDefault);
237239
});
238240
239241
const getCalendarWidth = (): void => {

src/VueDatePicker/directives/clickOutside.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ const useEventListener = (
3333
(el) => {
3434
cleanup();
3535
if (!el) return;
36-
36+
el.removeEventListener(event, listener);
3737
el.addEventListener(event, listener, options);
3838

3939
cleanup = () => {

0 commit comments

Comments
 (0)