这里介绍一下适合兄弟组件和父子,祖孙组件之间的传值方式-事件总线,废话不多说,直接上代码
总结:说白了这东西就是一种发布订阅的模式,发数据的一方用$emit发,各个接听方用$on接受对应key的事件,on的时候,就选择在DOM挂在完毕以后进行监听,通过这样的事件去修改数据,完成传递工作,感兴趣的同学可以吧这个代码拿下去直接调试运行一下看看
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<div id="app">
<com1></com1>
</div>
<template id="com1">
<div>
<h1>我是父组件</h1>
<span>我接受孙组件的数据:{{msg}}</span>
<input type="text" ref="txtMsg" v-model="msg" />
<com2></com2>
<com3></com3>
</div>
</template>
<template id="com2">
<div>
<h3>我是兄弟组件2</h3>
<button @click="SendMsg">
发送到兄弟组件3
</button>
<span>
我要接受兄弟组件com3的值:{{receiveTitle}},{{receiveMsg}}
</span>
</div>
</template>
<template id="com3">
<div>
<h3>我是兄弟组件3</h3>
<button @click="sendMsg">
发送到兄弟组件2
</button>
<span>
我要接受兄弟组件com2的值:{{receiveTitle}},{{receiveMsg}}
</span>
<com4></com4>
</div>
</template>
<template id="com4">
<div>
<h5>我是孙组件</h5>
<span>
我要接受来自祖组件com1的值:{{sunMsg}} 我要改变祖组件的值
<input type="text" ref="txtMsg" v-model="sunMsg" />
</span>
</div>
</template>
<script src="/lib/vue/vue.js"></script>
<script type="text/javascript">
var eventBus = new Vue();
var com4 = {
name: "com4",
template: "#com4",
data() {
return {
sunMsg: ""
};
},
watch: {
sunMsg() {
eventBus.$emit("SetGrandFatherMsg", this.sunMsg);
}
},
mounted() {
eventBus.$on("SetSunMsg", msg => {
//console.log(msg);
this.sunMsg = msg;
});
}
};
var com2 = {
name: "com2",
template: "#com2",
data() {
return {
com2Title: "你好",
com2Msg: "这是来自com2的消息",
receiveTitle: "",
receiveMsg: ""
};
},
mounted() {
eventBus.$on("SendCom2Msg", (title, msg) => {
this.receiveMsg = msg;
this.receiveTitle = title;
});
},
methods: {
SendMsg() {
eventBus.$emit("SendCom3Msg", this.com2Title, this.com2Msg);
}
}
};
var com3 = {
name: "com3",
template: "#com3",
data() {
return {
com3Title: "hello",
com3Msg: "This is the message from to COM3",
receiveTitle: "",
receiveMsg: ""
};
},
mounted() {
eventBus.$on("SendCom3Msg", (title, msg) => {
this.receiveMsg = msg;
this.receiveTitle = title;
});
},
components: {
com4
},
methods: {
sendMsg() {
eventBus.$emit("SendCom2Msg", this.com3Title, this.com3Msg);
}
}
};
var com1 = {
name: "com1",
template: "#com1",
data() {
return {
msg: ""
};
},
mounted() {
eventBus.$on("SetGrandFatherMsg", msg => {
this.msg = msg;
});
},
watch: {
msg: {
handler: function(newVal, oldVal) {
console.log(this.msg);
eventBus.$emit("SetSunMsg", this.msg);
}
}
},
components: {
com2,
com3
}
};
new Vue({
el: "#app",
components: {
com1
}
});
</script>
</body>
</html>
来源:https://www.cnblogs.com/llcdbk/p/12173530.html