Запустить пользовательское событие за пределами представления маршрутизатора в Vue.js

Я новичок в 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, но вы прослушиваете событие в представлении маршрутизатора, вы можете просто отправить событие из NavBar и обработать его следующим образом:

Yash Maheshwari 14.06.2024 13:16

вам не нужны никакие события, поскольку у вас уже есть реактивные реквизиты в NavBar, каждое изменение должно распространяться через реактивные данные, события — это последнее средство

Alexander Nenashev 14.06.2024 13:17

Вы пытаетесь решить проблему всего приложения с помощью локального состояния. Аутентификация относится к глобальному состоянию, vuejs.org/guide/scaling-up/state-management.html

Estus Flask 14.06.2024 13:40

@YashMaheshwari, большое спасибо за решение. Оно работало завораживающе

DXB-DEV 14.06.2024 13:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

предлагаю вам сделать eventBus

import Vue from 'vue';
export const EventBus = new Vue();

затем запускайте события из компонента навигационной панели и слушать события, используя шину событий

или попробуйте использовать «mitt» из npm, создать eventBus и использовать его во всем приложении.

импортировать перчатки из «рукавиц» константный эмиттер = митт() экспортировать эмиттер по умолчанию

Старая школа, но может сработать. Дополнительный контекст (+ SSR): deltener.com/blog/nuxt-enterprise-patterns-the-event-bus

kissu 14.06.2024 13:24

Это должно работать

sayed ehab 14.06.2024 13:29

Вопрос предполагает, что это Vue 3. Здесь нет «нового Vue».

Estus Flask 14.06.2024 13:37

попробуйте использовать «mitt» из npm и использовать его во всем приложении

sayed ehab 14.06.2024 13:47
Ответ принят как подходящий

Поскольку кнопка выхода из системы присутствует в NavBar, но вы прослушиваете событие в представлении маршрутизатора, вы можете просто отправить событие из NavBar и обработать его в файле приложения.

<NavBar :userId = "userId" :loggedIn = "isLoggedIn" @user-logged-out = "getLoggedOutUserInfo">

Вышеупомянутое решение сработало для меня. Спасибо @Яш Махешвари

DXB-DEV 19.06.2024 17:36

Другие вопросы по теме