vue 通信方式汇总
父级往子级通信 – props
parent:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26<template>
<div>
parent
<child :msg="parentmsg"/>
</div>
</template>
<script>
import Child from './Child';
export default {
name: 'Parent',
data() {
return {
parentmsg: 'this is msg from parent'
}
},
components: {
Child
}
}
</script>
<style lang="scss" scoped>
</style>child:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16<template>
<div>
child -- {{msg}}
</div>
</template>
<script>
export default {
props: ['msg'],
name: 'Child'
}
</script>
<style lang="scss" scoped>
</style>子级往父级通信 – $emit
parent:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35<template>
<div>
parent <br>
监听 子组件触发的 parentEvent 事件,通过 childEmitEvent 方法来处理
<child @parentEvent="childEmitEvent" :msg="parentmsg"/>
子组件传递过来的:{{childmsg}}
</div>
</template>
<script>
import Child from './Child';
export default {
name: 'Parent',
data() {
return {
parentmsg: 'this is msg from parent',
childmsg: ''
}
},
components: {
Child
},
methods: {
//监听 子组件 出发的 parentEvent 事件 的处理方法,data为传参
childEmitEvent(data) {
this.childmsg = data;
}
},
}
</script>
<style lang="scss" scoped>
</style>
child:
1 | <template> |
注意:不能用 $on 侦听子组件释放的事件,而必须在模板里直接用 v-on 绑定
可是父子组件如何双向绑定呢?如何对于父子组件间的prop
双向绑定其实官网里已经有里说明,
在一个包含 title
prop 的假设的组件中,我们可以用以下方法表达对其赋新值的意图:
1 | this.$emit('update:title', newTitle) |
然后父组件可以监听那个事件并根据需要更新一个本地的数据属性
1 | <text-document |
vue提供了为这种模式提供一个缩写:.sync
1 | <text-document v-bind:title.sync="doc.title"></text-document> |
注意带有 .sync
修饰符的 v-bind 不能和表达式一起使用 (例如 v-bind:title.sync=”doc.title + ‘!’” 是无效的)。取而代之的是,你只能提供你想要绑定的属性名,类似 v-model
- 兄弟组件通信
两种方式: - 通过前边的
props ,$emit
,通过父级组件作为介质相互通信 - 通过vue实例作为事件总线完成通信
注意: $emit 和 $on 只能作用在一个公共的实例上
eventBus:1
2import Vue from 'vue';
export default new Vue();
parent:
1 | <template> |
child:
1 | <template> |
childc:
1 | <template> |
- 子孙组件通信
- provide和inject – 只能通信,不能响应式
- vuex
对于provide和inject
,官网介绍的很详细:
祖先:
1 | provide: function () { |
任何后代:
1 | inject: ['getMap'] |
弊端:
- 祖先组件不需要知道哪些后代组件使用它提供的属性
- 后代组件不需要知道被注入的属性来自哪里
vuex状态管理方案,先不叙述了。