vue组件间通讯
组件通信常用方式:
-
props
-
$emit/$on
-
Event bus
-
vuex
边界情况:
-
$parent
-
$children
-
$root
-
$refs
-
provide/inject
-
非prop特性
-
$attrs
-
$listeners
// child
props: { msg: String }
// parent
<HelloWorld msg="Welcome to your Vue.js App" />
2.自定义事件$emit
子给父传值
// child
this.$emit('add', good)
// parent
<Cart @add="cartAdd($event)"></Cart>
3.事件总线 event bus
任意两个组件之间常用事件总线
// main.js
Vue.prototype.$bus = new Vue()
// child1
this.$bus.$emit('event', data)
// child2 注册在mounted()
this.$bus.$on('event', (data) => {...})
4. vuex
创建唯一的全局数据管理者store,通过它管理数据并通知状态
5.$parent/$root
兄弟组件之间通信科通过共同祖辈搭桥,$parent/$root
// borther1
this.$parent.$emit('foo')
//borther2
this.$parent.$on('foo', handle)
6.refs
// parent
<HelloWord ref="name" />
mounted() {
this.$refs.name.xx = 'xxx'
}
7.$attrs/$listeners
包含了父作用域中不作为props被识别(且获取)的特性绑定(class和style除外)。当一个组件没有声明任何prop时,这里会包含所有负作用域的绑定(class和style除外),并且可以通过v-bind="$attrs"传入内部组件--在创建高级别的组件是非常有用。
// child:并未在props中声明foo
<p>{{$attrs.foo}}</p>
// parent
<HelloWorld foo="foo"/>
// 给隔代GrandSon隔代传值,communication/index.vue
<child msg="lala" @some-event="onSomeEvent" />
// 在child中展开
<GrandSon v-bind="$attrs" v-on="$listeners" />
// 在GrandSon中使用
<div @click="$emit('some-event', '我是你的孙子')">
{{$attrs.msg}}
</div>
8.provide/inject
能够实现祖先和后代之间传值
// ancestor
provide() {
return { foo: 'foo' }
}
//descendant
inject: ['foo']

浙公网安备 33010602011771号