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

法一

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>

你可能感兴趣的:(vue)