Vue: прослушиватель событий beforeunload не удаляется

Я работаю над функцией отмены удаления, она состоит из небольшого модального окна, которое позволяет пользователю отменить/отложить действие на ограниченное время (аналогично gmail). Однако я хочу убедиться, что действие будет выполнено, если пользователь решит перейти в другое окно или закрыть вкладку, что я и делаю следующим образом:

mounted() {
  this.timeout = setTimeout(() => {
    this.close(true);
  }, this.duration);
  window.addEventListener('beforeunload', this.forceDestroyHandler, { capture: true });
},
methods: {
  close(deleteBeforeClosing) {
    if (deleteBeforeClosing) {
      clearTimeout(this.timeout);
      // This is the function dispatching to the store and deleting the item
      this.destructiveEvent(this.category, this.item.id);
    }
    this.$emit('close');
}

Затем я (пытаюсь) удалить прослушиватель событий на beforeDestroy:

beforeDestroy() {
  this.forceDestroy();
  window.removeEventListener('beforeunload', this.forceDestroyHandler, {capture: true});
},

Тем не менее, похоже, что beforeDestroy никогда не вызывается, а это означает, что прослушиватель событий никогда не удаляется, поэтому, если пользователь решает закрыть вкладку или перейти, ему будет предложено сообщение, даже если компонент отмены больше не отображается. Если пользователь нажмет «Отмена», в магазин будет отправлено другое действие, пытающееся удалить уже удаленный элемент, что приведет к ошибке сервера.

Я также пытался поместить removeEventListener в другое место, но у меня все та же проблема.


person suuuriam    schedule 02.04.2020    source источник
comment
почему вы звоните forceDestroy в beforeDestroy?   -  person Utsav Patel    schedule 02.04.2020
comment
forceDestroy может быть не лучшим именем, но оно просто закрывает модальное окно и выполняет удаление: forceDestroy() { return this.timeout !== 0 ? this.close(true) : null; },   -  person suuuriam    schedule 02.04.2020
comment
Когда вы закрываете вкладку/окно, хук жизненного цикла beforeDestroy() для компонента никогда не вызывается, потому что вы уничтожаете не компонент, а все окно вкладки.   -  person Terry    schedule 02.04.2020
comment
Обратный порядок функций в beforeDestroy   -  person Utsav Patel    schedule 02.04.2020
comment
@ Это имеет смысл! Но даже когда я removeEventListener в close() он не удаляется должным образом?   -  person suuuriam    schedule 02.04.2020
comment
@UtsavPatel, к сожалению, не работает.   -  person suuuriam    schedule 02.04.2020
comment
@Terry Теперь я удаляю прослушиватель событий в close(), и он внезапно работает - понятия не имею, почему он не работал раньше. Спасибо за вашу помощь!   -  person suuuriam    schedule 02.04.2020


Ответы (1)


Чтобы уточнить мой комментарий: причина, по которой ваш прослушиватель событий onbeforeunload не является несвязанным, заключается в том, что хук жизненного цикла beforeDestroy() запускается только при уничтожении компонента VueJS. Когда вы закрываете вкладку/окно браузера, весь поток стирается, и это не вызывает уничтожение компонента.

Поскольку вы хотите удалить слушателя только после закрытия модального окна, имеет смысл сделать это в методе close(): поэтому ваш подход сработал.

person Terry    schedule 02.04.2020