组件通信方式
第一种通信方式props
使用场景:[父子通信]
传递数据类型:
1:可能是函数  -----------实质子组件想给父亲传递数据
2:可能不是函数-----------实质就是父亲给子组件传递数据
接受方式:
1.props:['xxx']
2.props:{xxx:string}
3.props:{
  xxx:{
    type:String, //类型
    required:true, //必要性
    default:'老王' //默认值
  }
}
特殊情况:路由传递props
1:布尔值类型,把路由中params参数映射为组件props数据
2:对象,静态数据,很少用
3:函数,可以把路由中params|query参数映射为组件props数据
第二种通信方式 自定义事件 $on $emit
1. 一种组件间通信的方式,适用于:<strong style="color:red">子组件 ===> 父组件</strong>
2. 使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(<span style="color:red">事件的回调在A中</span>)。
3. 绑定自定义事件:
        第一种方式,在父组件中:```<Demo @atguigu="test"/>```  或 ```<Demo v-on:atguigu="test"/>```
        第二种方式,在父组件中:
          <Demo ref="demo"/>
          ......
          mounted(){
           this.$refs.xxx.$on('atguigu',this.test)
          }
4.若想让自定义事件只能触发一次,可以使用```once```修饰符,或```$once```方法。
5. 触发自定义事件:```this.$emit('atguigu',数据)```		
6. 解绑自定义事件```this.$off('atguigu')```
7. 组件上也可以绑定原生DOM事件,需要使用```native```修饰符。
8. 注意:通过```this.$refs.xxx.$on('atguigu',回调)```绑定自定义事件时,回调<span style="color:red">要么配置在methods中</span>,<span style="color:red">要么用箭头函数</span>,否则this指向会出问题!
第三种通信方式 全局事件总线 Vue.prototype.$bus = this 一种组件间通信的方式,适用于任意组件间通信。
组件实例的原型的原型指向的Vue.prototype
安装全局事件总线:
new Vue({
	......
	beforeCreate() {
		Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm
	},
    ......
}) 
使用全局事件总线:
接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的<span style="color:red">回调留在A组件自身。</span>
methods(){
  demo(data){......}
}
......
mounted() {
  this.$bus.$on('xxxx',this.demo)
}
提供数据:this.$bus.$emit('xxxx',数据)
最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。
第四种方式,消息订阅与发布
- 
一种组件间通信的方式,适用于任意组件间通信。
 - 
使用步骤:
- 
安装pubsub:
npm i pubsub-js - 
引入:
import pubsub from 'pubsub-js' - 
接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身。
 
methods(){ demo(data){......} } ...... mounted() { this.pid = pubsub.subscribe('xxx',this.demo) //订阅消息 } - 
 - 
提供数据:
pubsub.publish('xxx',数据) - 
最好在beforeDestroy钩子中,用
PubSub.unsubscribe(pid)去取消订阅。 
第五种方式 vuex 一种万能的组件通信方式 数据非持久化
基本使用
//引入vue
import Vue from 'vue'
//引入vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)
//引入vuex小仓库
......
export default new Vuex.Store({
    modules: {
       ......
    }
})
vuex基本环境
export default {
//开启命名空间
namespaced: true,
actions:{},
mutations:{},
state:{},
getters:{}
}
第六种方式 插槽
- 
作用:让父组件可以向子组件指定位置插入html结构,也是一种组件间通信的方式,适用于 父组件 ===> 子组件 。
 - 
分类:默认插槽、具名插槽、作用域插槽
 
                    
                
                
            
        
浙公网安备 33010602011771号