法一
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()
Amethods:{function(){eventVue.$emit('自定义事件','数据')}}
Bcreated(){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>