Lawrence_33
@Lawrence_33

Как удалить addEventListener?

Добрый день, подскажите пожалуйста делаю кастомный select по клику вне он доложен закрываться, при добавлении mounted() и beforeDestroy() перестает работать toggle(), то есть при клике на сам select он раскрывается но при клике повторно на него он не закрывается.
hideSelected(){
          this.visibelOptions = false
      }
    },
    mounted() {
      window.addEventListener('click', this.hideSelected, true);
    },
    beforeDestroy(){
      window.removeEventListener('click', this.hideSelected, true);
    }
  • Вопрос задан
  • 149 просмотров
Пригласить эксперта
Ответы на вопрос 2
Fragster
@Fragster
помогло? отметь решением!
Почему в заголовке пишешь про удаление обработчика, но при этом говоришь, что обработчик не срабатывает (т.е. не подцепляется)?
Вообще если бы было больше кода или пример на jsfiddle/codepen, оно было бы понятнее, но сейчас чисто визуально моему телепату кажется, что используется options api и при этом mounted и beforeDestroy находятся внутри methods а не на первом уровне (где должны быть хуки жизненного цикла компонента).

UPD: проблема в том, что клик сначала отрабатывает на компоненте, потом на документе и в итоге ничего не происходит. Правильнее всего отключить всплытие в обработчике:
toggle(e){
    e.stopPropagation()
   this.visibelOptions = true
      },


но можно и (например) сделать показ позже:
toggle(e){
    this.$nextTick().then(()=>
   this.visibelOptions = true)
      },

toggle(e){
    setTimeout(()=>
   this.visibelOptions = true, 0)
      },


или добавить проверку на скрытии:
hideSelected(e){
  if (this.$el !== e.target)
          this.visibelOptions = false
      }
Ответ написан
@zxf
Для таких ситуаций лучше вешать событие открытия на сам select или лейбл связанный с инпутом. Одним словом, на элемент, по которому раскрывается список. В методе обработчике этого @click реализовывать привязку и отвязку слушателя к/от глобальному объекту (window). Обработчик этого глобального слушателя должен проверять, на каком элементе произошло событие и вызывать соответствующие методы. И не забывайте о всплытии событий. Чтобы избежать всплытия во Vue существует модификатор .stop (@click.stop).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы