在Vue 2中,如果想要在两个不相干的组件之间调用方法,可以通过一个中间Vue实例来实现。这个中间实例可以利用$on
和$emit
来传递方法。
$on(eventName, callback)
:这个方法用于在当前组件实例上监听一个自定义事件。。当某个组件内部调用$emit
方法触发了对应的自定义事件时,该组件上的$on
方法绑定的处理函数将会被调用。通常情况下,$on
方法用于在父组件中监听子组件触发的事件,以便在父组件中做出相应的响应或处理。
$emit(eventName, [...args])
:这个方法用于触发当前组件实例上的一个自定义事件,并传递数据给监听该事件的处理函数。通常情况下,$emit
方法用于在子组件中触发事件,然后在父组件中通过$on
方法监听该事件并做出相应的处理。
// 子组件
this.$emit('childEvent', eventData);
// 父组件
this.$on('childEvent', function(eventData) {
// 处理事件
});
以两个不相干的组件ComponentA
和ComponentB
为例,我们创建一个专门用于方法调用的中间Vue实例,然后在需要的地方注入这个实例来调用方法。
创建一个中间Vue实例,例如MyMethodProvider.js
,内容如下
import Vue from 'vue';
const myMethodProvider = new Vue();
export default myMethodProvider;
// 导入中间组件
import MyMethodProvider from './myMethodProvider';
export default {
methods: {
componentAMethod() {
console.log('来自ComponentA组件中的componentAMethod方法执行了');
},
},
created() {
MyMethodProvider.$on('callComponentAMethod', this.componentAMethod);
},
};
// ComponentB.vue
import MyMethodProvider from './myMethodProvider';
export default {
methods: {
callMethodFromComponentA() {
//出发callComponentAMethod事件,调用ComponentB组件中的componentAMethod()方法
MyMethodProvider.$emit('callComponentAMethod');
},
},
};
在这个例子中,
ComponentA
中的方法被注册到MyMethodProvider
实例上,在ComponentB
中通过MyMethodProvider
实例触发callComponentAMethod
事件来调用ComponentA
中的componentAMethod()
方法。这样就实现了两个不相干组件之间的方法调用。