vue中的event bus非父子元件通訊
有時候非父子關係的元件也需要通訊。在簡單的場景下,使用一個空的Vue例項作為中央事件匯流排:
有時候非父子關係的元件也需要通訊。在簡單的場景下,使用一個空的 Vue 例項作為中央事件匯流排:
var bus = new Vue() |
// 觸發元件 A 中的事件bus.$emit('id-selected', 1) |
// 在元件 B 建立的鉤子中監聽事件bus.$on('id-selected', function (id) { // ...}) |
在更多複雜的情況下,你應該考慮使用專門的 狀態管理模式.就是用到了vuex
eventBus是作為兄弟關係的元件之間的通訊中介。
程式碼示例:
<!DOCTYPE html>
<html>
<head>
<title>eventBus</title>
<script src="http://cdn.jsdelivr.net/vue/1.0.28/vue.min.js"></script>
</head>
<body>
<div id="todo-app">
<h1>todo app</h1>
<new-todo></new-todo>
<todo-list></todo-list>
</div>
<script>
var eventHub = new Vue( {
data(){
return{
todos:['A','B','C']
}
},
created:function () {
this.$on('add', this.addTodo)
this.$on('delete', this.deleteTodo)
},
beforeDestroy:function () {
this.$off('add', this.addTodo)
this.$off('delete', this.deleteTodo)
},
methods: {
addTodo: function (newTodo) {
this.todos.push(newTodo)
},
deleteTodo: function (i) {
this.todos.splice(i,1)
}
}
})
var newTodo = {
template:`<div><input type="text" autofocus v-model="newtodo"/><button @click="add">add</button></div>`,
data(){
return{
newtodo:''
}
},
methods:{
add:function(){
eventHub.$emit('add', this.newtodo)
this.newtodo = ''
}
}
}
var todoList = {
template:`<ul><li v-for="(index,item) in items">{{item}} \
<button @click="rm(index)">X</button></li> \
</ul>`,
data(){
return{
items:eventHub.todos
}
},
methods:{
rm:function(i){
eventHub.$emit('delete',i)
}
}
}
var app= new Vue({
el:'#todo-app',
components:{
newTodo:newTodo,
todoList:todoList
}
})
</script>
</body>
</html>
效果圖如下: