DEV Community

Venkatesh Bishu
Venkatesh Bishu

Posted on

VueJS Computed Property

Suppose you have this list:

<template> <div> <h1>Avengers </h1> <ul> <li v-for="(hero, index) in heroes" :key="index"> {{hero}} </li> </ul> </div> </template> <script> export default { name: "App" data(){ heroes: ["Ironman", "Capitan America", "Hulk", "Thor", "Black Widow"] } } </script> 
Enter fullscreen mode Exit fullscreen mode

And then you wanted to add a search filter, so when you type in input field, it'll show matching heroes.

<template> <div> <h1>Avengers </h1> <input type="text" placeholder="Search Heroes" /> <ul> <li v-for="(hero, index) in heroes" :key="index"> {{hero}} </li> </ul> </div> </template> <script> export default { name: "App" data(){ heroes: ["Ironman", "Capitan America", "Hulk", "Thor", "Black Widow"] } } </script> 
Enter fullscreen mode Exit fullscreen mode

You can use computed properties for that.

But What exactly are Computed Properties?

Computed properties enable you to create a property that can be used to modify, manipulate, and display data within your components in a readable and efficient manner.

Second thing is computed properties are cached based on their dependencies means it'll only re-evaluate when some of its dependencies changed.

In code below, I have created a computed property heroList and have added term as a dependency, so when term is changed, heroList will be re-evaluated and rendered.

That means, When you type in input field, it'll change term value and re-render the list.

Type in input -> term value change -> heroList re-evaluated -> render heroList

<template> <div> <h1>Avengers </h1> <input type="text" placeholder="Search Hero's" v-model="term"/> <ul> <li v-for="(hero, index) in heroList" :key="index"> {{hero}} </li> </ul> </div> </template> <script> export default { name: "App" data(){ heroes: ["Ironman", "Capitan America", "Hulk", "Thor", "Black Widow"], term : "" }, computed: { // filtered list of heroes heroList(){ return this.heroes.filter(hero => { return hero.indexOf(this.term) !== -1 }) } } } </script> 
Enter fullscreen mode Exit fullscreen mode

Thanks for reading.

Top comments (0)