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!

VueJS - Computed Properties

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?

  1. Simplicity: They keep your template clean and easy to read.
  2. Performance: Vue caches the result and only re-computes when dependencies change.
  3. 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