Parent-child communication in Vue.js

Devanshu Agarwal

Written by Devanshu Agarwal /

Introduction

Vue.js is the coolest JavaScript framework for building amazing user interfaces! One of its best features is the ability to break down an application into smaller, reusable components. This modular approach makes it super easy to build complex applications, but it also brings a new challenge: how do these components talk to each other?

Parent-child communication in Vue.js is all about sharing data and triggering events between parent and child components. This makes it possible to build even more dynamic and interactive user interfaces. It's a pretty important concept to understand if you want to be a Vue pro!

There are a few ways to achieve parent-child communication in Vue.js, like using props, event emitting, or the $refs object. Each of these methods has its own unique strengths and weaknesses, so it's important to understand them all to pick the best one for your particular use case.

In this blog, we'll dive into the different methods for parent-child communication in Vue.js. We'll show you how to use props, event emitting, and the $refs object to share data and trigger events between parent and child components. By the end of this blog, you'll have a solid understanding of the different methods for parent-child communication in Vue.js, and you'll be ready to choose the best one for your next project!

Using Props for Parent-Child Communication

Using props is one of the simplest and most straightforward ways to communicate data from a parent component to a child component in Vue.js. Props are a way to pass data from a parent component to a child component, and they work by binding data to the child component as properties. The child component can then access this data using the props option.

To bind a prop from a parent component to a child component, you need to declare the prop in the child component's props option. For example, if you want to pass a message from the parent component to the child component, you could declare a message prop in the child component like this:

JS
<template>
  <div>
    {{ message }}
  </div>
</template>

<script>
export default {
  props: ['message']
}
</script>

Next, you can use the child component in the parent component and bind the message prop to a value. For example:

JS
<template>
  <div>
    <child-component v-bind:message="'Hello World'"/>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  }
}
</script>

In this example, the parent component is using the v-bind directive to bind the message prop to the string "Hello World". When the child component is rendered, it will display the message in the template.

Props are a great way to pass data from a parent component to a child component, and they work well when the data is static or only needs to be passed in one direction. However, if you need to pass data from the child component back to the parent component, or if you need to make changes to the data in the child component, you'll need to use another method, such as event emitting.

Event Emitting for Parent-Child Communication

Have you ever been to a concert and felt the excitement of the crowd as the singer starts to belt out the chorus? Well, that's exactly what event emitting feels like in Vue.js! With event emitting, you can send data from the child component to the parent component just like the crowd is cheering to the singer.

Here's how it works: the child component emits an event, and the parent component listens for that event. When the event is emitted, the parent component can access the data that was sent with the event. This makes it possible to pass data from the child component to the parent component in real-time, making event emitting a powerful tool for parent-child communication in Vue.js.

To emit an event from a child component, you can use the $emit method. For example, if you want to emit an event from the child component to the parent component with a message, you could do something like this:

JS
<template>
  <div>
    <button @click="sendMessage">Send Message</button>
  </div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message-sent', 'Hello World');
    }
  }
}
</script>

In this example, the child component has a button with a click event that calls the sendMessage method. When the button is clicked, the child component emits an event with the name message-sent and the message "Hello World".

To listen for the event in the parent component, you can use the v-on directive. For example:

JS
<template>
  <div>
    <child-component v-on:message-sent="receiveMessage"/>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  methods: {
    receiveMessage(message) {
      console.log(message);
    }
  }
}
</script>

In this example, the parent component is using the v-on directive to bind a listener for the message-sent event to the receiveMessage method. When the event is emitted from the child component, the receiveMessage method will be called and the message will be logged to the console.

Event emitting is a great way to pass data from the child component to the parent component in real-time, and it can be used to build dynamic and interactive user interfaces. So, the next time you want to cheer on your favorite singer, just think of event emitting in Vue.js!

Using the $refs Object for Parent-Child Communication

Picture yourself driving a race car. You're going fast, and you need to communicate with your pit crew to get information on the track conditions ahead. That's exactly what the $refs object in Vue.js does for you! With the $refs object, you can communicate between the parent component and the child component just like a race car driver communicating with their pit crew.

The $refs object is a reference to an element or component in your Vue.js app. You can use it to access the properties and methods of a child component from the parent component. This makes it possible to pass data from the child component to the parent component, or vice versa, without using props or events.

For example, if you have a child component with a method that sets a message, you can access that method from the parent component using the $refs object like this:

JS
<template>
  <div>
    <button @click="setMessage">Set Message</button>
  </div>
</template>

<script>
export default {
  methods: {
    setMessage() {
      this.message = 'Hello World';
    }
  },
  data() {
    return {
      message: ''
    }
  }
}
</script>

In this example, the child component has a button with a click event that calls the setMessage method. When the button is clicked, the message is set to "Hello World".

In the parent component, you can access the child component and call the setMessage method using the $refs object like this:

JS
<template>
  <div>
    <child-component ref="child"/>
    <button @click="sendMessage">Get Message</button>
  </div>
</template>

<script>
import ChildComponent from './ChildComponent.vue'

export default {
  components: {
    ChildComponent
  },
  methods: {
    sendMessage() {
      this.$refs.child.setMessage();
    }
  }
}
</script>

In this example, the parent component is using the ref attribute to create a reference to the child component, which is stored in the $refs object. When the sendMessage method is called, it accesses the child component through the $refs object and calls the setMessage method.

The $refs object is a powerful tool for parent-child communication in Vue.js, and it's especially useful when you need to access a child component's methods or properties directly. So, buckle up and get ready to communicate with your pit crew, just like a race car driver!

Conclusion

parent-child communication in Vue.js is like a well-oiled machine, with different methods that work together to make your application run smoothly. Whether you're using props, events, or the $refs object, each method has its own unique benefits and can be used in different situations to achieve your desired results.

Props are great for passing data from the parent component to the child component, while events are ideal for passing data from the child component to the parent component. And when you need to access a child component's methods or properties directly, the $refs object is the perfect tool for the job.

So, whether you're a seasoned Vue.js developer or just starting out, these methods will help you communicate effectively between parent and child components in your application. So go ahead, try them out, and make your Vue.js application run like a well-oiled machine!