牛骨文教育服务平台(让学习变的简单)
博文笔记

vue中的event bus非父子组件通信

创建时间:2016-12-21 投稿人: 浏览次数:9797

有时候非父子关系的组件也需要通信。在简单的场景下,使用一个空的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>

效果图如下:


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。