Я новичок в Vue.js и не могу понять, как событие передается из компонента за пределами представления маршрутизатора в App.vue. В настоящее время я использую приведенный ниже код в App.vue.
<template>
<div>
<NavBar :userId = "userId" :loggedIn = "isLoggedIn" />
<router-view :userId = "userId"
@user-logged-in = "getLoggedInUserInfo"
@user-logged-out = "getLoggedOutUserInfo">
</router-view>
</div>
</template>
<script>
import NavBar from '@/components/NavBar.vue';
export default {
name: 'App',
components: {
NavBar,
},
data: function () {
return {
userId: null,
isLoggedIn: false,
}
},
methods: {
getLoggedInUserInfo: function(data) {
this.userId = data.user.userId;
this.isLoggedIn = true;
},
getLoggedOutUserInfo: function() {
this.userId = '';
this.isLoggedIn = false;
}
}
}
</script>
Я использую страницу (компонент) Login.vue для ввода учетных данных для входа в приложение. Эта страница является частью представления маршрутизатора. Я могу вызвать событие входа пользователя в систему на странице Login.vue, и оно работает должным образом, когда пользователь входит в систему.
this.$emit("user-logged-in", data);
Однако, когда пользователь выходит из системы, я хочу получить некоторую информацию в компоненте NavBar, чтобы можно было повторно отобразить элементы меню NavBar. Кнопка выхода из системы остается в компоненте Navbar.
Я попытался выполнить выход из App.vue из NavBar.vue, как показано, и это не сработало:
this.$emit("user-logged-out");
Буду признателен за любую оказанную помощь!
вам не нужны никакие события, поскольку у вас уже есть реактивные реквизиты в NavBar, каждое изменение должно распространяться через реактивные данные, события — это последнее средство
Вы пытаетесь решить проблему всего приложения с помощью локального состояния. Аутентификация относится к глобальному состоянию, vuejs.org/guide/scaling-up/state-management.html
@YashMaheshwari, большое спасибо за решение. Оно работало завораживающе



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


предлагаю вам сделать eventBus
import Vue from 'vue';
export const EventBus = new Vue();
затем запускайте события из компонента навигационной панели и слушать события, используя шину событий
или попробуйте использовать «mitt» из npm, создать eventBus и использовать его во всем приложении.
импортировать перчатки из «рукавиц» константный эмиттер = митт() экспортировать эмиттер по умолчанию
Старая школа, но может сработать. Дополнительный контекст (+ SSR): deltener.com/blog/nuxt-enterprise-patterns-the-event-bus
Это должно работать
Вопрос предполагает, что это Vue 3. Здесь нет «нового Vue».
попробуйте использовать «mitt» из npm и использовать его во всем приложении
Поскольку кнопка выхода из системы присутствует в NavBar, но вы прослушиваете событие в представлении маршрутизатора, вы можете просто отправить событие из NavBar и обработать его в файле приложения.
<NavBar :userId = "userId" :loggedIn = "isLoggedIn" @user-logged-out = "getLoggedOutUserInfo">
Вышеупомянутое решение сработало для меня. Спасибо @Яш Махешвари
Насколько я понимаю, кнопка выхода из системы присутствует в NavBar, но вы прослушиваете событие в представлении маршрутизатора, вы можете просто отправить событие из NavBar и обработать его следующим образом: