Vue 组件间通信主要指以下 3 类通信:父子组件通信、隔代组件通信、兄弟组件通信
1.props / $emit 适用 父子组件通信
props是父组件将值传给子组件,$emit是子组件通过派发事件的方式将值传给父组件
2.ref 与 $parent / $children 适用 父子组件通信
1)ref:如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例
2)`$parent / $children` :访问父、子实实例,需要注意的是:
children是一个数组,因为子组件可能有多个,通过parent和$children可以直接修改父子组件的data
`Parent.vue`
<Child />
<Child />
<Child />
{
data(){
return {
parentMsg:'parent'
}
},
mounted(){
this.$children[0].childMsg = 'changed'
}
}
`Child`
{
data(){
return {
childMsg:'child'
}
},
mounted(){
this.$parent.parentMsg = 'changed'
}
}
3.EventBus ($emit/$on) 适用于 父子、隔代、兄弟组件通信
这种方法通过一个空的 Vue 实例作为中央事件总线(事件中心),用它来触发事件和监听事件,从而实现任何组件间的通信,包括父子、隔代、兄弟组件:
使用EventBus我们需要实例化一个空的不具备DOM的Vue,为方便使用,可以把其挂在项目将实例的Vue的原型上
`main.js`
Vue.prototype.$EventBus = new Vue()
`CompnentA`
{
methods:{
testA(){
this.$EventBus.$emit('cmaFunction',params)
}
}
}
`ComponentB`
{
mounted(){
this.$EventBus.$on('cmaFunction',(params)=>{
console.log(params)
})
}
}
4.$attrs/$listeners 适用于 隔代组件通信
- attr包含了父作用域中不作为prop被识别(且获取)的特性绑定(class和style除外),并且可以通过v−bind="attrs"继续向下传递,通常配合 inheritAttrs 选项一起使用(inheritAttrs=true的时候,传递的属性会加到子组件的根元素上)
例如:
`Parent.vue`
<Child name="jack" age="18" weight="135">
`Child.vue`
/可以将$attrs继续传向后代组件
<GrandSon v-bind="$attrs">
{
props:['weight'],
mounted(){
//这里'weight'已经被作为props识别了,所以¥attrs上不再包含weight属性
console.log(this.$attrs) // {name:'jack',age:'18'}
}
}
`GrandSon.vue`
{
mounted(){
console.log(this.$attrs) //{name:'jack',age:'18'}
}
}
- listeners:包含了父作用域中的(不含.native修饰器的)v−on事件监听器。它可以通过v−on="listeners" 传入内部组件
例如:
`Parent.vue`
<Child v-on:click="myClick">
`Child.vue`
//可以将$attrs继续传向后代组件
<GrandSon v-bind="$listeners">
{
mounted(){
console.log(this.$listeners) // {name:'jack',age:'18'}
}
}
`GrandSon.vue`
{
mounted(){
console.log(this.$listeners) //{name:'jack',age:'18'}
}
}
5.provide / inject 适用于 隔代组件通信
祖先组件中通过 provider 来提供变量,然后在子孙组件中通过 inject 来注入变量。 provide / inject API 主要解决了跨级组件间的通信问题,不过它的使用场景,主要是子组件获取上级组件的状态,跨级组件间建立了一种主动提供与依赖注入的关系。
`Parent.vue`
{
provide:{
foo:'bar'
}
}
`GrandSon.vue`
{
inject:['foo'],
mounted(){
console.log(this.foo) // bar
}
}
6.Vuex 适用于 父子、隔代、兄弟组件通信
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )。
- Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。每一个 Vuex 应用的核心就是 store(仓库)。“store” 基本上就是一个容器,它包含着你的应用中大部分的状态 ( state )。
- 改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation。这样使得我们可以方便地跟踪每一个状态的变化
> vuex主要包括以下几个模块:
State:定义了应用状态的数据结构,可以在这里设置默认的初始状态。
Getter:允许组件从 Store 中获取数据,mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性。
Mutation:是唯一更改 store 中状态的方法,且必须是同步函数。
Action:用于提交 mutation,而不是直接变更状态,可以包含任意异步操作
Module:允许将单一的 Store 拆分为多个 store 且同时保存在单一的状态树中。