Eventos Personalizados no Vue.js
No Vue.js, a comunicação entre componentes pode ser feita por meio de props
A estrutura básica para criar e capturar um evento personalizado é a seguinte: o componente pai escuta o evento emitido pelo filho utilizando v-on
<child-component v-on:myevent="action"></child-component>
Aqui, "myevent"
"action"
No componente filho, o evento é emitido usando this.$emit('myevent')
"myevent"
Exemplo de Implementação
O exemplo a seguir demonstra um componente Vue que emite um evento para atualizar um nome de usuário:
<!DOCTYPE html>
<html>
<head>
<title>Componentes Vue.js</title>
<meta charset="utf-8" />
<script src="https://unpkg.com/vue"></script>
</head>
<body>
<div id="app">
<h2>Hello, {{ name }}</h2>
<useredit :user="name" v-on:userchange="change"></useredit>
</div>
<script>
const app = Vue.createApp({
data() {
return {
name: 'Tom'
};
},
methods: {
change(value) {
this.name = value;
}
}
});
app.component('useredit', {
props: ["user"],
data() {
return { userName: this.user };
},
template: `
<div>
<input type="text" v-model="userName" v-on:input="onUserChange" />
<p>Name: {{ userName }}</p>
</div>
`,
methods: {
onUserChange() {
this.$emit('userchange', this.userName);
}
}
});
app.mount('#app');
</script>
</body>
</html>
Nesse exemplo, o evento userchange
No template do componente useredit
input
userName
v-model
v-on:input="onUserChange"
<input type="text" v-model="userName" v-on:input="onUserChange" />
O método onUserChange
userchange
userName
onUserChange() {
this.$emit('userchange', this.userName);
}
O primeiro argumento de this.$emit()
O componente useredit
userchange
v-on:userchange="change"
change
name
<useredit :user="name" v-on:userchange="change"></useredit>
change(value) {
this.name = value;
}
Como resultado, sempre que o usuário digitar um novo nome no componente useredit
userchange
name
