Vue.js - How to call method from another component
For non-parent-child relation, then this is the same as this one. Call one method, apparently any method of a component from any other component. Just add a $on
function to the $root
instance and call form any other component accessing the $root
and calling $emit
function.
On First component
.... mounted() { this.$root.$on('component1', () => { // your code goes here this.c1method() } }
and in the second component call the $emit
function in $root
... c2method: function(){ this.$root.$emit('component1') //like this },
It acts more like a socket. Reference here
https://stackoverflow.com/a/50343039/6090215
The docs address this situation
https://v2.vuejs.org/v2/guide/components.html#Non-Parent-Child-Communication
If your components have the same parent, you can emit an event that the parent listens to. Then with the ref
property set, you can call the c1method
from the parent.
https://v2.vuejs.org/v2/guide/components.html#Child-Component-Refs
No need for hacky solutions.
In vuejs we can create events that can be listened globally.
With this feature, whenever we want to call our beloved function, we just emit this event.
Now, we just listen to this event all the time from the component. whenever this global event happens we can execute our method we want to call.
It's pretty simple:
- you go to main.js, before creating the vue instance, write this:
export const eventBus = new Vue(); // added line
new Vue({
...
...
...
render: h => h(App)
}).$mount('#app');
- Anywhere we want to fire the target function, we dont fire it, we just emit this event:
eventBus.$emit('fireMethod');
- Now in our component that has the target function, we always listen to this event:
created() {
eventBus.$on('fireMethod', () => {
this.myBelovedMethod();
})
}
Dont forget to import eventBus in top.
import {eventBus} from "path/to/main.js";
thats it, few lines of code, no hacky, all vuejs power.
// Component A
Vue.component('A', {
created() {
this.$root.$refs.A = this;
},
methods: {
foo: function() {
alert('this is A.foo');
}
}
});
// Component B
Vue.component('B', {
methods: {
bar: function() {
this.$root.$refs.A.foo();
}
}
});