六种通信方式
一、Props
- 父与子组件通信
1
2
3
4
5
6
7
8
9
10
11
12
13
14<Child :name='name' :func='func' />
// 三种子组件接收形式
props: ['name']
props:{
name:String
}
props:{
name:{
type:String,
required:true,
default:'name'
}
} - 路由Props
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
name:'home',
path:'/home',
componenet: Home,
// 三种形式
props:true,
props:{key:'value'},
props:($route)=>{
return {
id: $route.query.id,
title: $route.query.title
}
}
}
二、自定义事件
- 适用子与父组件通信
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16// 两种事件绑定方式
<Child @parentEvent='eventFunc' ref='child' />
mounted(){
this.$refs.child.$on('parentEvent',this.eventFunc);
this.$refs.child.$once('parentEvent',this.eventFunc);
}
// 触发
emitFunc(){
this.$emit('parentEvent',params),
}
// 取消绑定
unbindFunc(){
this.$off('parentEvent')
this.$off(['parentEvent','event2'])
}
三、全局事件总线
- 任意组件间通信
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18// Vue原型链上绑定$bus
beforeCreate(){
Vue.prototype.$bus = this;
},
// 组件1事件绑定
component1Func(){
this.$bus.$on('event',this.func)
}
// 取消绑定
beforeDestroy(){
this.$bus.$off('event',this.func)
}
// 组件2事件触发
component2Func(){
this.$bus.$emit('event',params)
}
四、pubsub-js
- 任意组件间通信
1
2
3
4
5
6
7
8
9
10
11
12import pubsub from 'pubsub-js'
// 订阅与取消订阅
mounted(){
this.pubId = pubsub.subscribe('newsName',this.callbackFunc)
}
beforeDestroy(){
pubsub.unsubscribe(this.pubId)
}
// 发布
sendNewsFunc(){
pubsub.publish('newsName',params)
}
五、Vuex
- 任意组件间通信
store/index.js
1 | // 模块化 |
store/user.js
1 | // 处理业务逻辑 |
组件中使用 Home.vue
1 |
|
六、插槽
父子组件通信(结构)
子组件结构不定,由父组件确定
默认插槽
1 | // -- 子组件 |
具名插槽 :适用多个插槽时
1 | // -- 子组件 |
作用域插槽: 子组件通过props回传数据给父组件
1 | // -- 数据提供者子组件 结构由父组件确定 |
通信其他相关
自定义事件与原生事件
1 | // click为自定义事件 |
父子组件数据同步
1 | // -- 父组件 :value为props @input为自定义事件 $event接收回调函数参数 |
1 | // 效果同上 |
1 | // 效果同上 |
$attrs与$listeners
1 | // 组件属性在 $attrs与props互斥存在 |
$children与$parent
1 | // 获取所有子组件实例 |
混入mixin
1 | // 功能逻辑复用 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CrazyKong!
评论