The $emit Function in Vue
Aug 8, 2019
Vue components have a $emit()
function that allows you to pass custom events up the component tree.
Vue.component('my-component', {
mounted: function() {
// `$emit()` sends an event up the component tree. The parent
// can listen for the 'notify' event using 'v-on:notify'
this.$emit('notify');
},
template: '<div></div>'
});
const app = new Vue({
data: () => ({ show: false }),
// Vue evaluates the expression in 'v-on:notify' when it gets a 'notify'
// event.
template: `
<div>
<my-component v-on:notify="show = true"></my-component>
<div v-if="show">Notified</div>
</div>
`
});
All Vue instances have a $emit()
function, including both top-level apps and
individual components.
const app = new Vue({
template: '<div></div>'
});
let called = 0;
app.$on('test-event', () => { ++called; });
app.$emit('test-event');
called; // 1
Why $emit()
?
Generally, you use $emit()
to notify the parent component that something changed. For example, suppose you have a component input-name
that takes a prop called name
. This component exposes an input form asking the user for their name, and an 'Update' button that updates the name.
The way to do this is for input-name
to $emit()
an event called 'update' when the user clicks the 'Update' button, with the new name.
Vue.component('input-name', {
data: () => ({ name: 'World' }),
// When you click the "Update" button, Vue will emit an event `update`
// to the parent, with the current state of 'name'.
template: `
<div>
<input type="text" v-model="name">
<button v-on:click="$emit('update', name)">
Update
</button>
</div>
`
});
const app = new Vue({
data: () => ({ name: 'World' }),
// To listen to the 'update' event, you create the `input-name`
// component with a `v-on:update` attribute. `$event` contains
// the value of the 2nd parameter to `$emit()`.
template: `
<div>
<div>
<input-name v-on:update="setName($event)"></input-name>
</div>
<h1>Hello, {{name}}</h1>
</div>
`,
methods: {
// Define a method that Vue will call to handle the 'update' event.
setName: function(v) {
this.name = v;
}
}
});
app.$mount('#content');
Vue School has some of our favorite Vue
video courses. Their Vue.js Master Class walks you through building a real
world application, and does a great job of teaching you how to integrate Vue
with Firebase.
Check it out!
Did you find this tutorial useful? Say thanks by starring our repo on GitHub!