π¦ Vue Props β Pass Data Between Components in Vue.js (2025 Guide)
π§² Introduction β What Are Props in Vue?
In Vue.js, props (short for properties) are the primary way to pass data from a parent component to a child component. They form the backbone of Vueβs component communication system and are critical for creating reusable, modular components.
π― In this guide, youβll learn:
- What props are and why theyβre important
- How to define, pass, and validate props
- The difference between static and dynamic props
- Best practices and common mistakes
π What Is a Prop in Vue?
A prop is a custom attribute on a child component tag that lets you pass data from the parent to the child.
β Basic Example:
<!-- Parent Component -->
<ChildComponent message="Hello from Parent" />
// ChildComponent.vue
props: ['message']
π§ message
will be available as a reactive variable inside the child.
π§± Defining Props in Components
β Using an Array (Simple Syntax)
props: ['title', 'count']
β Using an Object (Detailed with Validation)
props: {
title: String,
count: {
type: Number,
required: true,
default: 0
}
}
π§ This allows type checking, defaults, and required flags.
π Passing Static vs Dynamic Props
β Static (Hardcoded):
<Alert message="Static Text" />
β Dynamic (Uses JavaScript variable):
<Alert :message="alertText" />
π§ The :
tells Vue to evaluate the expression instead of using a string literal.
π§ͺ Full Working Example β Prop Communication
β Parent Component:
<ProductCard :product="item" />
data() {
return {
item: { name: 'Laptop', price: 999 }
}
}
β
Child Component (ProductCard.vue
):
<template>
<div>
<h2>{{ product.name }}</h2>
<p>${{ product.price }}</p>
</div>
</template>
<script>
export default {
props: ['product']
}
</script>
π§ The child now displays information passed from the parent via product
.
β οΈ Common Prop Issues
β Using props as data (mutation):
// Avoid mutating props directly
this.message = 'Changed';
β Use a local copy if needed:
data() {
return {
localMessage: this.message
};
}
π‘οΈ Prop Type Validation and Defaults
Property | Purpose |
---|---|
type | Validates the prop type |
default | Sets a fallback value if not provided |
required | Throws warning if missing |
β Example:
props: {
price: {
type: Number,
default: 0,
required: true
}
}
π One-Way Data Flow
Props are one-way bound: data flows from parent β child, not the other way.
This makes component communication predictable and easy to debug.
π¦ Real-World Example β Button with Label
β Reusable Button:
<template>
<button>{{ label }}</button>
</template>
<script>
export default {
props: {
label: {
type: String,
required: true
}
}
}
</script>
β Parent:
<BaseButton label="Submit" />
<BaseButton label="Cancel" />
π§ Easy-to-reuse component with different labels via props.
π Syncing Props with Events (v-model
+ modelValue
)
In Vue 3, you can use v-model
with props like modelValue
:
β Child:
<template>
<input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" />
</template>
<script>
export default {
props: ['modelValue']
}
</script>
β Parent:
<TextInput v-model="name" />
π§ Seamless two-way binding using props + emit.
π Summary β Recap & Next Steps
Props in Vue are essential for passing data from parent to child components. They enable component reusability, logic separation, and maintainable architecture in Vue apps.
π Key Takeaways:
- Props pass data downward from parent to child
- Use
props: []
or an object with validation - Props are read-only and one-way
- Use
modelValue
and$emit
for two-way communication
βοΈ Real-World Relevance:
Props power dynamic interfaces like product cards, form inputs, alerts, dropdowns, and reusable UI components.
β FAQ Section
β What is a prop in Vue?
β A prop is a way to pass data from a parent component to a child component via custom attributes.
β How do I validate props?
β Use the object syntax:
props: {
title: { type: String, required: true }
}
β Are props reactive?
β Yes, props are reactive. If the parent updates the value, the child receives the new data automatically.
β Can a child component modify a prop?
β
No. Props are read-only. Use a local copy in data()
if you need to modify it.
β How to implement two-way binding with props?
β
Use v-model
with modelValue
and emit update:modelValue
from the child.
Share Now :