详解Vue组件之间通信的七种方式

2020-06-14 06:07:16易采站长站整理

import Grandson from './grandson.vue';
export default {
data() {
return {

}
},
inject: ['updateTitle'],
methods: {
changeAttr() {
this.updateTitle('子组件修改标题');
}
},
components: {
Grandson
}
}
</script>
// 孙组件
<template>
<div>
<button @click="changeAttr">修改祖先组件的属性</button>
</div>
</template>

<script>
export default {
inject: ['updateTitle'],
methods: {
changeAttr() {
this.updateTitle('孙组件修改标题');
}
}
}
</script>
```

2)$attrs和$listeners

组件A下面有一个组件B,组件B下面有一个组件C,如果想将组件A的数据和自定义事件传递给组件C,就可以使用$attrs和$listeners。

vm.$attrs: 当一个组件没有声明任何 prop 时(没有在props声明属性),这里会包含所有父作用域的绑定 ,并且可以通过

v-bind="$attrs
” 传入内部组件

vm.$listeners: 包含了父作用域中的 (不含 .native 修饰器的) v-on 事件监听器。它可以通过 v-on=”$listeners” 传入内部组件。

https://cn.vuejs.org/v2/api/#vm-attrs

具体


```
// 父组件
<template>
<div>
<Children :msg="msg" v-on:changeMsg="changeMsg"/>
</div>
</template>

<script>
import Children from './children';
export default {
data() {
return {
msg: '下发数据',
test: '123'
}
},
components: {
Children
},
methods: {
changeMsg() {
this.msg = '修改后的数据';
}
}
}
</script>
// 子组件
<template>
<div>
<Grandson v-bind="$attrs" v-on="$listeners"/>
</div>
</template>

<script>
import Grandson from './grandson';
export default {
components: {
Grandson
}
}
</script>
// 孙组件
```
<template>
<div>
<h3>{{$attrs.msg}}</h3>
<button @click="change">修改数据</button>
</div>
</template>

<script>
export default {
data() {
return {

}
},
methods: {
change() {
this.$emit('changeMsg')
}
}
}