vue中的组件通信(子向父和任意组件之间)(组件的自定义事件、全局事件总线、消息订阅与发布)

组件的自定义事件(子 => 父)

  1. 一种组件中通信的方式,适用于:子组件 => 父组件
  2. 适用场景:A是父组件,B是子组件,B给A传数据,就要在A中给B绑定自定义事件(事件的回调在A中)
  3. 绑定自定义事件:
    在父组件中:(xxx为自定义事件名)(demo为子组件名)
    方法一:<demo @xxx="test">
    方法二:
      <demo ref="demo"><demo>
        ... 
      mounted(){
        this.$refs.xxx.$on('xxx',this.test)
      }
      ```
    
  4. 若想让自定义事件只能触发一次,可以使用once修饰符,或$once方法
  5. 触发自定义事件:this.$emit('xxx',数据)(写在子组件中)
  6. 解绑自定义事件:this.$off('xxx')(写在父组件中)
  7. ⚠️:通过this.$refs.xxx.$on('xxx',回调函数)绑定自定义事件时,回调函数要么配置在methods中,要么用箭头函数。否则this指向会出问题

全局事件总线(任意之间)

  1. 适用于任意组件之间的通信
  2. 安装全局事件总线:
new Vue({
  ....
  beforeCreate() {
    // 安装全局事件总线,$bus就是当前应用的app
    Vue.prototype.$bus = this;
  }
})
  1. 使用事件总线:
    1. 接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身
    methods: {
      demo(data) { ... }
    }
    ...
    mounted() {
      this.$bus.$on('xxx',this.demo)
    }
    
    1. 提供数据:this.$bus.$emit('xxx',数据)
  2. 最好在beforeDestroy钩子中,用$off去解绑当前组件用到的事件(谁$on了谁$off)

消息订阅与发布(任意之间)

同样适用于任意组件之间的通信
使用步骤:

  1. 安装pubsub:npm install pubsub-js
  2. 引入:import pubsub from 'pubsub-js'
  3. 接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身
methods:{
  demo(data){

  }
}
... 
mounted(){
  this.pid = pubsub.subscribe('xxx',this.demo)  // 订阅消息
}
  1. 提供数据:pubsub.publish('xxx',数据)
  2. 最好在beforeDestroy钩子中,用pubsub.unsubscibe(pid)去取消订阅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue ,父组件组件传值可以使用 props,而组件向父组件传值可以使用自定义事件。 具体实现步骤如下: 1. 在父组件定义一个数据属性,将要传递组件的值绑定到该属性上。 2. 在组件通过 props 接收父组件传递过来的值。 3. 在组件创建一个方法,触发该方法时,通过 $emit 方法向父组件发送一个自定义事件,并将组件需要传递给父组件的值作为参数传递给该事件。 下面是代码示例: 父组件: ``` <template> <div> <child :value="value" @child-click="handleClick"></child> </div> </template> <script> import Child from './Child.vue' export default { components: { Child }, data() { return { value: 'hello' } }, methods: { handleClick(value) { console.log(value) } } } </script> ``` 组件: ``` <template> <div> <button @click="handleClick">点击向父组件传值</button> </div> </template> <script> export default { props: { value: String }, methods: { handleClick() { this.$emit('child-click', this.value) } } } </script> ``` 在组件,我们使用 props 接收了父组件传递过来的值 value,然后在 handleClick 方法,通过 $emit 方法触发了一个名为 child-click 的自定义事件,并将组件需要传递给父组件的值作为参数传递给该事件。在父组件,我们监听了该自定义事件,并通过 @child-click="handleClick" 绑定了一个名为 handleClick 的方法,该方法接收了组件传递过来的值 value,并将其输出到控制台

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值