的主要問題是如何建立同一層次的組件之間的通信,爲解決這個我實現了與事件總線方式的Vue.js文件上描述:
https://vuejs.org/v2/guide/components.html#Non-Parent-Child-Communication
我剛剛創建的Vue的新實例名爲EventBus
// EventBus.js
import Vue from 'vue'
export default new Vue()
然後我包括這在全球範圍上我的主要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 }
})
有了這個,我能發出對我的組件的事件,並與同一層級這樣聽他們對其他組件:
// 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)
}
})
}
}
}
而且我可以聽我的其他組件的觸發事件的創建方法是這樣設置監聽器:
// NavBar.js
export default {
template: '<Navigation/>',
name: 'navigation',
data() {
return {
isLogged: this.checkIfIsLogged()
}
},
created() {
this.$bus.$on('logged',() => {
this.isLogged = this.checkIfIsLogged()
})
}
}
希望可以作爲參考