组价三部曲
组件之间的数据传递的方式
1. 父传子 :通过props属性传递
2. 子传父 通过$emit属性,用来发布自定义事件
3. 兄弟组件之间的传递
<body>
<div id="app">
<child :c="msg"></child>
<child :c="num" :b="obj"></child>
<child :b="obj"></child>
</div>
<script src="vue.js"></script>
<script>
let child={
data(){
return {
//msg:"苏大强" :如果自己身上也有msg这个属性,会去取父组件上的msg
}
},
props:["c","b"],
template:"{{c}}{{b}}"
}
let vm=new Vue({
el:"#app",
data:{
msg:"春光郑好",
num:"豫战豫勇",
obj:"中国加油"
},
components:{
child
}
})
</script>
</body>
<body>
<div id="app">
父亲: {{money}}
<!-- // 自定义事件 -->
<son :m="money" @changemoney="fn" :b="fn"></son>
</div>
<script src="vue.js"></script>
<script>
let son = {
data(){
return {}
},
props:["m","b"],// props接收到的属性也会放在组件实例上一份
methods:{
add(){
// this==> 组件的实例
this.$emit("changemoney",1080);//这里面的1080传给fn中的val
// this.b();
}
},
template:"儿子:{{m}}"
}
let vm = new Vue({
el:"#app",
data:{
money:888
},
methods:{
fn(val){
this.money=val;
}
},
components:{
son
}
});
</script>
</body>
子传父中的sync修饰符
代码中的两个方法是上面子传父的语法糖,也就是简写。写了这两个后父组件的methods中的方法就可以不写了。
<body>
<div id="app">
父亲: {{money}}
<!-- $event接收的是$emit的第二个参数 -->
<!-- <son :m="money" @update:m="money=$event"></son> -->
<son :m.sync="money" :v.sync="val"></son>
</div>
<script src="node_modules/vue/dist/vue.js"></script>
<script>
// 语法糖
let son = {
data(){
return {}
},
props:["m","v"],
methods:{
add(){
this.$emit("update:m",2000);
this.$emit("update:v",8899);
}
},
template:"儿子:{{m}}{{v}}"
}
new Vue({
el:"#app",
data:{
money:888,
val:1000
},
methods:{
},
components:{
son
}
});
</script>
</body>
兄弟之间的组件数据传递:eventBus;
$on : 订阅
$emit : 发布;轮询对应的事件池,让其中的方法执行
let eventBus = new Vue;// 这就是一个容器;联系了兄弟之间的纽带
下面写一个简单的案例,点弟弟组件让哥哥组件变绿,点弟弟让哥哥变红
<body>
<div id="app">
<bro1></bro1>
<bro2></bro2>
</div>
<script src="../VUE上课/vue.js"></script>
<script>
// 兄弟之间的组件数据传递:eventBus;
// $on : 订阅
// $emit : 发布;轮询对应的事件池,让其中的方法执行
let eventBus = new Vue;// 这就是一个容器;联系了兄弟之间的纽带
let bro1 = {
data(){
return {
color:"红色"
}
},
created(){//这里面可以那倒methods中的方法,但是不能拿到真实的DOM
eventBus.$on("changeGreen",this.changeGreen)
},
methods:{
fn1(){
eventBus.$emit('changeRed');
},
changeGreen(){
this.color="绿色"
}
},
template:"{{color}}"
};
let bro2 = {
data(){
return {
color:"绿色"
}
},
created(){
eventBus.$on("changeRed",this.changeRed)
},
methods:{
changeRed(){
this.color="红色";
},
fn2(){
eventBus.$emit('changeGreen');
}
},
template:"{{color}}"
};
let vm = new Vue({
el:"#app",
data:{
},
components:{
bro1,
bro2
}
})
</script>
</body>