Повторяющиеся события, испускаемые компонентом VueJS

Когда мой курсор мыши входит и покидает мой компонент VueJS, соответственно вызываются следующие методы.

Методы, которые вызываются, когда курсор входит и покидает мой компонент:

// located in "methods" section of my Vue component file

onMouseEnter() {
    window.Event.$emit("mouse-entered", this.index);
    console.log("Mouse entered");
},
onMouseLeave() {
    window.Event.$emit("mouse-left", this.index);
    console.log("Mouse left");
},

Ожидаемо, вот как выглядит моя консоль, когда мой курсор входит и покидает компонент (каждый раз генерируется одно событие):

введите здесь описание изображения

Однако, что действительно странно, так это то, что в инструментах разработки Vue я вижу повторяющиеся события, которые генерируются каждый раз, когда мой курсор входит и покидает мой компонент:

введите здесь описание изображения

Учитывая эту противоречивую информацию, я не знаю, чему верить. Обновление страницы иногда устраняет повторяющиеся события в инструментах разработки, но я всегда получаю отдельные уникальные события в своей консоли, что является моим желаемым поведением.

Кто-нибудь знает, что здесь происходит и что я должен принять за источник правды?

Ниже показано, как мои экземпляры Vue объявляются и инициализируются в моем файле main.js:

// As far as I can tell, duplicated Vue instances are not being created here on page refresh

let app;

// global event bus
window.Event = new Vue();
console.log("Event bus created");

/* This section ensures the firebase auth object isn't in an intermediary state. */
firebase.auth().onAuthStateChanged(() => {
    if (!app) {
        console.log("New Vue instance created");
        app = new Vue({
            el: '#app',
            router,
            store,
            render: h => h(App)
        });
    }
});

Обратите внимание, что этот конкретный компонент повторно используется на двух разных маршрутах ("dashboard" и "home"), которые поддерживаются следующим кодом.

// Template section of App.vue file
<template>
    <div id="app">
        <keep-alive
            v-bind:include="[ 'dashboard', 'home' ]"
            <router-view></router-view>
        </keep-alive>
    </div>
</template>

Кроме того, поскольку эти два маршрута поддерживаются и кэшируются, отказ от отключения эмиттеров и прослушивателей событий $off не должен быть причиной дублирования (по крайней мере, я думаю, что не должен).

РЕДАКТИРОВАТЬ 1: я нашел все для "ввода мыши" и "ухода мыши" в каждом отдельном каталоге в моем проекте, и я могу подтвердить, что оба события генерируются только из компонента Vue. упоминается в этом посте.

РЕДАКТИРОВАТЬ 2: чтобы облегчить отладку, я поместил прослушиватель на свой самый верхний компонент (App.vue), чтобы проверить, получает ли он событие дважды (см. созданный хук во фрагменте кода ниже) . Я могу подтвердить, что он также получает событие только один раз. Я также вставил свой полный файл App.vue, поскольку приведенный выше пример был в основном для иллюстрации того, что я поддерживаю "панель инструментов" и "домой ".

<template>
    <div id="app">
        <keep-alive
            v-bind:include="keepAlive">
            <router-view></router-view>
        </keep-alive>
    </div>
</template>

<script>
    export default {
        name: 'app',
        data() {
            return {
                isLoggedIn: false,
            };
        },
        computed: {
            keepAlive() {
                if (this.isLoggedIn) {
                    return [ 'dashboard', 'home', 'results' ];
                }
                return [ 'landing', 'signIn', 'signUp' ];
            }
        },
        watch: {
            /* This watches for route changes */
            $route(to, from) {
                /* firebase.auth().currentUser returns null if user has logged out */
                if (firebase.auth().currentUser) {
                    this.isLoggedIn = true;
                } else {
                    this.isLoggedIn = false;
                }
            }
        },
        created() {
            window.Event.$on("mouse-entered", () => {
                console.log("mouse-entered-from-App.vue");
            });
            window.Event.$on("mouse-left", () => {
                console.log("mouse-left-from-App.vue");
            });
        }
    };
</script>

Как и ожидалось, App.vue получает событие один раз (см. ниже); однако я все еще получаю повторяющиеся события в инструментах разработки Vue :(

введите здесь описание изображения


person p4t    schedule 21.07.2018    source источник
comment
Это определенно странно. Возможно, это и не нужно, но проверяли ли вы дважды, что у вас нет каких-либо событий mouse-entered где-то еще в вашем коде без console.log, которые можно было бы каким-то образом вызвать? Можете ли вы постоянно получать такое поведение при навигации? Или требуется редактирование и сохранение вашего кода?   -  person Sumurai8    schedule 21.07.2018
comment
@Sumurai8 Sumurai8 Я могу подтвердить, что события никогда не отправляются из других компонентов после поиска всех в каталогах моего проекта. Это постоянно происходит, когда я перехожу к другим маршрутам и возвращаюсь к маршрутам (панели инструментов и дома), на которых находится этот компонент. Кроме того, события только когда-либо дублируются, никогда больше.   -  person p4t    schedule 21.07.2018
comment
Я не могу представить себе ситуацию, когда событие сработает, но сообщение консоли не будет дублироваться, поэтому вы можете попытаться поместить прослушиватель на свой самый верхний компонент и посмотреть, получит ли это событие дважды. Если это не так, я думаю, можно с уверенностью сказать, что в vue devtools есть ошибка. В противном случае нам нужно искать дальше.   -  person Sumurai8    schedule 22.07.2018
comment
@Sumurai8 Sumurai8 Я добавил прослушиватель в App.vue и могу подтвердить, что он получает событие только один раз, но я все еще получаю повторяющиеся события, создаваемые в инструментах разработки. Я также добавил весь свой код App.vue, который выглядит нормально для меня, но может кое-что открыть для других.   -  person p4t    schedule 22.07.2018
comment
пока событие фактически запускается только один раз (например, ведение журнала консоли), не должно иметь значения, что отображается в инструментах разработчика, ваша программа должна работать. не так ли? .. это может быть ошибка в vue-devtools. Может быть, всплывает какое-то скрытое событие?   -  person Tobias Würth    schedule 03.10.2018


Ответы (1)


Вы написали

Обновление страницы иногда устраняет повторяющиеся события в инструментах разработки, но я всегда получаю отдельные уникальные события в своей консоли, что является моим желаемым поведением.

Как вы описываете свою проблему, события генерируются правильно, в то время как на них реагируют неправильным, дублирующим образом. Я думаю, что вам может не хватать отказа от подписки на вашу шину событий после уничтожения компонента. Для этого вы должны использовать хук beforeDestroy (аналогично тому, как вы использовали created ранее в жизненном цикле компонента для подписки).

Что-то вроде этого:

beforeDestroy() {
    window.Event.$off('mouse-entered');
    window.Event.$off('mouse-left');
}
person van-koelljor    schedule 04.10.2018