Vue 父子组件通信
几种常见的通信方式:
1、prop 属性
父组件通过绑定属性的方式,给子组件传值,同时子组件通过设置 props 来接收
<div id="app">
<child :content="msg"></child>
</div>
<script>
let Child = Vue.extend({
template: '<h1>{{content}}</h1>',
props: {
content: {
type: String,
default: () => { return 'from child' }
}
}
})
new Vue({
el: '#app',
data: {
msg: 'hello'
},
components: {
Child
}
})
</script>
2、$emit
子组件通过调用 this.$emit(‘事件’,‘参数’) 给父组件通信,父组件通过监听 子组件的事件,来获取
<div id="app">
<v-button @parent="handleParent"></v-button>
</div>
<script>
let vButton = Vue.extend({
template: '<button @click="handleClick"></button>',
data: {
tragger: 'hello vue'
},
methods: {
handleClick() {
this.$emit('parent', this.tragger)
}
}
})
new Vue({
el: '#app',
data: {
content: ''
},
methods: {
handleParent(val) {
this.content = val
}
},
components: {
vButton
}
})
</script>
3、属性attrs 和 $listeners
4、EventBus (bus 总线)
思路就是声明一个全局Vue实例变量 EventBus , 把所有的通信数据,事件监听都存储到这个变量上。这样就达到在组件间数据共享了,有点类似于 Vuex,但复杂的项目还是用 Vuex
子组件通过 EventBus.$emit() 向外触发事件,父组件通过EventBus.$on() 来监听该事件,变量保存在EventBus
5、Vuex
Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式
6、通过ref 属性
//父组件
<template>
<div>
<Button @click="handleClick">点击调用子组件方法</Button>
<Child ref="child"/>
</div>
</template>
<script>
import Child from './child';
export default {
methods: {
handleClick() {
this.$refs.child.navigate();
},
},
}
</script>
//子组件
<template>
<div>我是子组件</div>
</template>
<script>
export default {
methods: {
navigate() {
console.log('我是子组件的方法');
},
},
};
</script>

浙公网安备 33010602011771号