@hckn

Как настроить throttle/debounce в этом случае?

Сделал пример - https://codesandbox.io/s/r551o8q45m

Троттл/дебанс я использую чтобы сделать UX более приятным. Например: если юзер просто случайно проводит мышкой над ссылкой я не хочу ему сразу показывать попап, только если он задержится над ссылкой (как в Википедии на ссылках окна). И при удалении мышки я не хочу сразу мгновенно убирать окно, а полсекунды его еще показывать.

По каждой отдельной ссылке все работает ОК.

Проблема возникает в таком сценарии: если навести мышку на ссылку 111 >> дождатся попап >> быстро перевести мышку на ссылку 222 >> дождатся попап >> резко перевести на ссылку 333 >> дождатся попап, то после при отведении мышки закрывается только последний попап!

Перепробовал все варианты throttle/debounce, leading/trailing, пробовал вешать дополнительно флаг на mouseover, нифига не работает. То одно ломается, то другое.

Как решить?
  • Вопрос задан
  • 426 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
Проблема в том, что метод popup - он у вас один на все экземпляры компонента. Отсюда и невозможность закрытия попапов сразу после открытия - метод просто не вызывается, таймаут ещё не окончился.

Чтобы работало так, как вы хотите, popup в каждом отдельном экземпляре должен быть уникальной функцией, т.е. в methods ему не место:

created() {
  this.popup = _.throttle(function(state) {
    this.show = ({
      enter: true,
      leave: false,
    })[state];
  }, 500, {
    leading: false,
    trailing: true,
  });
},

Ну и как-то громоздко выглядит. Может ну их, эти enter/leave:

this.popup = _.throttle(show => this.show = !!show, 500, {
  leading: false,
  trailing: true,
});

<a href="#" @mouseenter="popup(1)" @mouseleave="popup(0)">

??
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы