vue——组件间(兄弟组件间)事件派发与接收

本文介绍了两种在Vue中实现组件间,尤其是兄弟组件间通信的方法。法一利用`$parent`和`$children`进行事件传递,通过在main.js中设置全局eventBus。法二则采用中央通信的方式,创建一个公共的bus对象作为消息中介,实现组件间的通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

法一

main.js

在初始化vue之前,给 data 添加一个名为 event 的空vue对象

new Vue({
  render: h => h(App),
  router,
  store,
  data: {
    event: new Vue()
  }
}).$mount('#app')

组件一:

methods: {
      addCart (e) {
        let pos = {
          x: parseInt(e.target.getBoundingClientRect().x + 4),
          y: parseInt(e.target.getBoundingClientRect().y + 4)
        }
        this.$root.event.$emit('ballPosition', pos)
      }
}

组件二:

    created () {
      this.$root.event.$on('ballPosition', (target) => {
        this._initBall(target)
      })
    },
    
	methods: {
      _initBall (target) {
        this.ball = true
        this.ballMassage = target
      }
	}
完整案例:

抛物小球动画:

    created () {
      this.$root.event.$on('ballPosition', (target) => {
        this._initBall(target)
      })
    },
    methods: {
      _initBall (el) {
        this.ball.show = true
        this.ball.el = el
      },
      beforeEnter (el) {
        let pos = this.ball.el.target.getBoundingClientRect()
        el.style.top = `${pos.y}px`
        el.style.left = `${pos.x}px`
      },
      enter (el, done) {
        // 触发动画重绘
        el.offsetHeight
        let [x, y] = [parseInt(this.$refs.cart.getBoundingClientRect().x + 4), parseInt(this.$refs.cart.getBoundingClientRect().y + 8)]
        el.style.top = `${y}px`
        el.style.left = `${x}px`
        el.style.transition = `left .1s linear, top .1s cubic-bezier(.63,.02,.96,.56)`
        done()
      },
      afterEnter () {
        this.ball.show = false
      }
    },

法二

中央通信: let eventVue = new Vue()
A methods:{function(){eventVue.$emit('自定义事件','数据')}}
B created(){eventVue.$on('A 发送过来的事件名','函数')}

中央通信:

let eventVue = new Vue()

兄弟组件 A 如下:

<template>
      <div class="components-a">
           <button @click="abtn">A按钮</button>
      </div>
</template>
<script>
import eventVue from '../../js/event.js'
export default {
      name: 'app',
      data () {
        return {
                ‘msg':"我是组件A"
        }
      },
      methods:{
           abtn:function(){
                   eventVue.$emit("myFun",this.msg)   //$emit这个方法会触发一个事件
           }
      }
}
</script>

兄弟组件 B 如下:

<template>
     <div class="components-a">
         <div>{{btext}}</div>
     </div>
</template>
<script>
import eventVue from '../../js/event.js'
export default {
   name: 'app',
   data () {
        return {
           'btext':"我是B组件内容"
        }
   },
   created:function(){
       this.bbtn();
   },
   methods:{
       bbtn:function(){
            eventVue.$on("myFun",(message)=>{   //这里最好用箭头函数,不然this指向有问题
                 this.btext = message      
            })
       }
    }
}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值