В основном я использую библиотеку datepicker, которая не генерирует события фокуса или размытия, поэтому мне нужно добавить их вручную, но у меня возникают проблемы с удалением прослушивателей событий из-за восходящего потока v-if
.
У меня так получилось:
<datepicker :id="datePickerId">
...
computed: {
datePickerId() { return `date-picker-${this.name}`; },
},
mounted() {
document.getElementById(this.datePickerId).addEventListener('focus', this.handleFocus);
document.getElementById(this.datePickerId).addEventListener('blur', this.handleBlur);
},
beforeDestroy() {
document.getElementById(this.datePickerId).removeEventListener('focus', this.handleFocus);
document.getElementById(this.datePickerId).removeEventListener('blur', this.handleBlur);
},
Это отлично работает до тех пор, пока мой компонент не будет условно отрисован через v-if
, например:
<my-datepicker v-if="isDisplayed">
Я исследовал его, и проблема, похоже, заключается в том, что элемент ввода удален из DOM из-за v-if
, но экземпляр Vue все еще существует, поэтому метод жизненного цикла beforeDestroy
вызывается после того, как элемент уже исчез.
Есть ли способ предотвратить утечку памяти, не считая простого пропуска шага очистки и использования современной сборки мусора в браузере?
Мне очень интересно узнать больше о том, как получить больший контроль над тем, что происходит в то время, когда v-if
становится ложным. Об этом «неподходящем моменте времени» не так много статей / выпусков / билетов, поэтому, если у кого-то есть какие-либо связанные мнения, пожалуйста, не стесняйтесь добавлять их.
Есть ли другой способ подключиться к событиям фокуса / размытия ввода сторонней библиотеки?
[Предупреждение Vue]: Ошибка в обработчике beforeDestroy: «TypeError: невозможно прочитать свойство removeEventListener, равное null»