登录vuejs后重新渲染导航栏

Mir*_*ack 4 javascript frontend vue.js

我正在尝试使用vue创建客户端登录,我有一个主要组件,嵌套的是导航栏和呈现内容的组件。在创建导航组件时,我检查用户是否已登录以显示访客按钮并隐藏保护部分的按钮我的问题是在登录组件上提交登录后,我不知道如何触发导航栏组件的重新重新显示以显示正确的按钮

我不知道我的主要组件上是否应该有一个全局变量,还是应该找到一种方法将事件从子对象发送到父亲,再将另一个事件从主组件发送到导航栏,或者更多呢?简单但我不知道

如果您需要更多信息,请提前告知我

Mir*_*ack 6

主要问题是如何在相同层次结构的组件之间建立通信,以解决我实现的问题以及Vue.js文档中描述的事件总线方法:

https://vuejs.org/v2/guide/components.html#Non-Parent-Child-Communication

我只是创建了一个名为EventBus的Vue新实例。

// EventBus.js
import Vue from 'vue'
export default new Vue()
Run Code Online (Sandbox Code Playgroud)

然后将其全局包含在我的主要Vue实例中

// main.js
import EventBus from './EventBus'
import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

Vue.prototype.$bus = EventBus

/* eslint-disable no-new */
new Vue({
    el: '#app',
    router,
    template: '<App/>',
    components: { App }
})
Run Code Online (Sandbox Code Playgroud)

这样,我可以在我的组件上发出事件,并在具有相同层次结构的其他组件上监听它们,如下所示:

// Login.Vue
import axios from 'axios'
export default {
     name: 'login',
     data () {
         let data = {
             form: {
                  email: '',
                  password: ''
             }
         }
         return data
     },
    methods: {
        login () {
            axios.post('http://rea.app/login', this.form)
            .then(response => {
                let responseData = response.data.data
                this.$localStorage.set('access_token', responseData.token)
                this.$bus.$emit('logged', 'User logged')
                this.$router.push('/')
            })
            .catch(error => {
                if (error.response) {
                    console.log(error.response.data)
                    console.log(error.response.status)
                    console.log(error.response.headers)
                }
            })
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以在其他组件上监听触发的事件,从而在create方法上设置监听器,如下所示:

// NavBar.js
export default {
     template: '<Navigation/>',
     name: 'navigation',
     data () {
         return {
             isLogged: this.checkIfIsLogged()
         }
     },
     created () {
         this.$bus.$on('logged', () => {
             this.isLogged = this.checkIfIsLogged()
         })
     }
 }
Run Code Online (Sandbox Code Playgroud)

希望可以作为参考