How do you emit an event from a nuxt plugin?

前端 未结 3 1956
傲寒
傲寒 2021-01-18 19:19

I am creating a plugin that will emit basic nuxt events triggered by sockets. The nuxt event will then be recieved and open a snackbar. When inside a component it is easy to

3条回答
  •  旧时难觅i
    2021-01-18 19:28

    I figured another way to do it, by creating a manual event bus using Vue itself and using combined inject

    In my case, I had a global axios interceptor to check the responses for a status code of 401, meaning that the user's session has expired and then display a notification to them.

    
    // my-plugin.js
    import Vue from 'vue'
    
    export default function ({ $axios, app }, inject){
    
      inject('eventHub', new Vue()); // this is the same as Vue.prototype.$eventHub = new Vue()
    
      // checking for status 
        $axios.onError((error) => {
        const code = parseInt(error.response && error.response.status)
        if (code === 401) {
          app.$auth.logout() // logout if errors have happened
          app.$eventHub.$emit('session-expired')
        }
      })
    }
    
    

    The event bus is now accessible both in context and in any Vue instance

    // login.vue
    
    export default{
      data(){
        // data
      },
      created(){
        this.$eventHub.$once('session-expired', ()=> {
        this.showAlert()
      })
      },
      methods: {
        showAlert(){
          // display notifcations
        }
      }
    }
    

提交回复
热议问题