(1)props / $emit 适用 父子组件通信
<body>
<div id="app">
<mycom name='bbb' :age='age'></mycom>
<input type="text" v-model='age'>
</div>
</body>
</html>
<script src="vue.js"></script>
<script>
let myCom = {
props: ['name', 'age'],
template: "<p>aaaaaa:{{name}}----{{age}}</p>",
data: function() {
return {}
}
};
new Vue({
el: '#app',
data: {
age: 18,
money: 123.45,
},
//局部
components: {
'mycom': myCom
}
})
</script>
<body>
<div id="app">
<mycom @myclick="fun2"></mycom>
</div>
</body>
</html>
<script src="vue.js"></script>
<script>
let myCom = {
template: `<div>
<input type="button" @click='aaa'>
</div>`,
data: function() {
return {}
},
methods: {
aaa() {
this.$emit('myclick', 'ccccc');
}
}
};
new Vue({
el: '#app',
data: {
},
methods: {
fun2(str) {
console.log('fun2', str);
}
},
components: {
'mycom': myCom
}
})
</script>
(2)ref 与 $parent / $children
适用 父子组件通信
- refs是vue中获取dom的一种方式,dom也就是标签,标签就是组件。即就是:拿到了dom,就相当于拿到了组件对象。
- **如果某个元素使用ref属性,那么,在vue对象里,就能用this.parent / $children```:访问父 / 子实例
<body>
<div id="app">
<mycom ref='pdd'></mycom>
<button @click='fun'>X</button>
</div>
</body>
</html>
<script src="vue.js"></script>
<script>
let myCom = {
template: `<div> {{msg}}
</div>`,
data: function() {
return {
msg: 'aaa'
}
},
methods: {
aaa(x) {
this.msg = x
}
}
};
new Vue({
el: '#app',
data: {
ms: 'BBB'
},
methods: {
fun() {
this.$refs.pdd.aaa(this.ms);
}
},
//局部
components: {
'mycom': myCom
}
})
</script>
(3)EventBus (on) 适用于 父子、隔代、兄弟组件通信 事件总线
这种方法通过一个空的 Vue 实例作为中央事件总线(事件中心),用它来触发事件和监听事件,从而实现任何组件间的通信,包括父子、隔代、兄弟组件。
vue-bus实质就是创建一个vue实例,通过一个空的vue实例作为桥梁实现vue组件间的通信。它是实现非父子组件通信的一种解决方案。
步骤:
1、单独new一个Vue空对象:
let bus= new Vue();
2、在组件A里,绑定一个自定义事件:
bus.$on('eclick',target => {
console.log(target)
})
3、在组件B里,触发事件
bus.$emit(''eclick'',"b传给a的");
示例:
<body>
<div id="app">
<my-com1></my-com1>
<my-com2></my-com2>
</div>
</body>
</html>
<script src="vue.js"></script>
<script>
// 定义一个vue对象(作为事件总线的对象)
let bus = new Vue();
let myCom1 = {
template: `
<div>
<hr>
{{a}}
<hr>
</div>
`,
data() {
return {
a: 'aaaaa',
}
},
created() {
// 注册了一个事件
bus.$on("eclick", (target) => {
this.a = target;
});
}
}
let myCom2 = {
template: `
<div>
<input type="button" value=" 传 " @click="fn" />
</div>
`,
methods: {
fn() {
//触发事件
bus.$emit("eclick", "bbbb");
}
}
}
Vue.component("my-com1", myCom1);
Vue.component("my-com2", myCom2);
new Vue({
el: "#app"
});
</script>
(4)listeners 适用于 隔代组件通信
attrs" 传入内部组件。通常配合 inheritAttrs 选项一起使用。
listeners" 传入内部组件
(5)provide / inject 适用于 隔代组件通信
祖先组件中通过 provider 来提供变量,然后在子孙组件中通过 inject 来注入变量。 provide / inject API 主要解决了跨
级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。
(6)Vuex 适用于 父子、隔代、兄弟组件通信
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )。
Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。
改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化。