exploring the world of Computed Properties in Vue.js. Do not worry if you are new to programming - I will be your friendly guide and we will take it step by step. By the end of this tutorial, you will be surprised at how much you have learned!
What are Computed Properties?
Imagine you are baking a cake. You have ingredients (data) and follow a recipe (logic) to create something delicious (computed property). In Vue.js, computed properties are like magical cake recipes that automatically update when their ingredients change!
Let's start with a simple example:
<template>
<div>
<p>Name: {{ firstName }}</p>
<p>Surname: {{ lastName }}</p>
<p>Full Name: {{ fullName }}</p>
</div>
</template>
<script>
export default {
data() {
return {
firstName: 'John',
lastName: 'Doe'
}
},
computed: {
fullName() {
return this.firstName + ' ' + this.lastName
}
}
}
</script>
In this example, fullName
is our computed property. It's like a smart recipe that combines firstName
and lastName
to give us a full name. The best part? Whenever firstName
or lastName
changes, fullName
updates automatically!
Why Use Computed Properties?
- Simplicity: They keep your template clean and easy to read.
- Performance: Vue caches the result and only re-computes when dependencies change.
- Dependability: They update automatically when their dependencies change.
Computed Properties vs Methods
"But wait," you might say, "couldn't we just use a method instead?" Great question! Let's compare:
<template>
<div>
<p>Computed: {{ reversedMessage }}</p>
<p>Method: {{ reverseMessage() }}</p>
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello, Vue!'
}
},
computed: {
reversedMessage() {
return this.message.split('').reverse().join('')
}
},
methods: {
reverseMessage() {
return this.message.split('').reverse().join('')
}
}
}
</script>
Both reversedMessage
and reverseMessage()
do the same thing. But here's the secret sauce: computed properties are cached. If message
doesn't change, reversedMessage
won't recalculate. It's like having a super-efficient assistant who remembers previous results!
Computed Properties with Dependencies
Computed properties are most useful when they depend on multiple pieces of data. Let's look at a more complex example:
<template>
<div>
<input v-model="searchQuery" placeholder="Search todos">
<ul>
<li v-for="todo in filteredTodos" :key="todo.id">{{ todo.text }}</li>
</ul>
</div>
</template>
<script>
export default {
data() {
return {
searchQuery: '',
todos: [
{ id: 1, text: 'Learn Vue', completed: false },
{ id: 2, text: 'Build an app', completed: true },
{ id: 3, text: 'Master computed properties', completed: false }
]
}
},
computed: {
filteredTodos() {
return this.todos.filter(todo =>
todo.text.toLowerCase().includes(this.searchQuery.toLowerCase())
)
}
}
}
</script>
Here, filteredTodos
acts as a smart filter. It monitors both todos
and searchQuery
. When either changes, it updates the list automatically. Magic, right?
Get/Set in Computed Properties
Now, let's level up! Computed properties can have both a getter and a setter. It's like having a two-way recipe – you can read the result and modify the ingredients!
<template>
<div>
<p>Full Name: {{ fullName }}</p>
<button @click="changeFullName">Change Name</button>
</div>
</template>
<script>
export default {
data() {
return {
firstName: 'John',
lastName: 'Doe'
}
},
computed: {
fullName: {
get() {
return this.firstName + ' ' + this.lastName
},
set(newValue) {
const names = newValue.split(' ')
this.firstName = names[0]
this.lastName = names[names.length - 1]
}
}
},
methods: {
changeFullName() {
this.fullName = 'Jane Smith'
}
}
}
</script>
In this example, fullName
is not just a recipe (getter) but also a reverse recipe (setter). When we change fullName
, it automatically updates firstName
and lastName
. It's like having a magical name-changing potion!
Computed Property Methods
Let's finish with a table of common methods you can use within computed properties:
Method | Description | Example |
---|---|---|
filter() |
Creates a new array with elements that pass a test | this.items.filter(item => item.price > 100) |
map() |
Creates a new array by transforming every element | this.items.map(item => item.name.toUpperCase()) |
reduce() |
Reduces an array to a single value | this.items.reduce((total, item) => total + item.price, 0) |
sort() |
Sorts the elements of an array | this.items.sort((a, b) => a.price - b.price) |
includes() |
Checks if an array contains a certain element | this.items.includes('apple') |
find() |
Returns the first element that passes a test | this.items.find(item => item.id === 3) |
Remember, these methods don't modify the original array, which is perfect for computed properties!
And there you have it, my eager learners! You've just mastered the art of computed properties in Vue.js. From simple calculations to complex filtering, you now have the power to make your Vue applications smarter and more efficient. Keep practicing, keep coding, and most importantly, keep having fun with Vue!
Credits: Image by storyset