App.vue
ChildComp.vue
main.js
 
<template>
  <h2>Example $emit() Method</h2>
  <p>Ratings received from child component:</p>
  <ul id="ulElRatings">
    <li v-for="x in ratings">{{ x }}</li>
  </ul>
  <child-comp v-on:message-sent="receiveEmit" />
</template>

<script>
export default {
  data() {
    return {
      ratings: ['Hairdrier, rating: 7']
    }
  },
  methods: {
    receiveEmit(name,rating) {
      const item = name + ', rating: ' + rating;
      this.ratings.push(item);
    }
  }
}
</script>

<style>
#ulElRatings {
  background-color: lightgreen;
  padding: 20px;
  max-width: 300px;
  font-family: 'Courier New', Courier, monospace;
}
</style>                  
<template>
  <div>
    <h3>ChildComp.vue</h3>
    <p>Rate a product:</p>
    <input type="text" v-model="productName" placeholder="Product name.." ref="inpName">
    <input type="number" v-model="productRating" placeholder="Rating 1 to 10..">
    <button v-on:click="send">Register</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      productName: null,
      productRating: null
    }
  },
  methods: {
    send() {
      this.$emit('message-sent',this.productName,this.productRating);
      this.productName = null;
      this.productRating = null;
      this.$refs.inpName.focus();
    }
  },
  mounted() {
    this.$refs.inpName.focus();
  }
}
</script>

<style scoped>
div {
  border: solid black 1px;
  padding: 10px;
  max-width: 350px;
  margin-top: 20px;
}
input {
  display: block;
  margin-bottom: 15px;
}
</style>                  
import { createApp } from 'vue'

import App from './App.vue'
import ChildComp from './components/ChildComp.vue'

const app = createApp(App)
app.component('child-comp', ChildComp)
app.mount('#app')
                  
http://localhost:5173/