DEV Community

Cover image for Avoid Unnecessary Re-renders in Vue with `v-memo`
Jakub Andrzejewski
Jakub Andrzejewski

Posted on

Avoid Unnecessary Re-renders in Vue with `v-memo`

When building Vue applications, performance usually feels great by default - Vue’s reactivity system is incredibly efficient.

But as applications grow larger, you may eventually run into situations where:

  • components re-render too often
  • large lists become expensive
  • UI updates feel sluggish
  • unnecessary computations happen repeatedly

This is where memoization becomes useful. And in Vue, one of the easiest ways to optimize rendering is with v-memo.

In this article, we’ll explore:

  • What memoization is
  • What problem it solves
  • How v-memo works in Vue
  • Real-world examples
  • Best practices and common mistakes

Let’s dive in.

🤔 What Is Memoization?

Memoization is an optimization technique where results are cached and reused instead of recalculating them again.

Instead of:

  • recomputing
  • re-rendering
  • recalculating

You simply use the cached version.

🟢 What Problem Does Memoization Solve?

In reactive applications, updates can trigger many re-renders even when most data has not changed for example:

  • Parent component updates
  • Entire list re-renders
  • Hundreds of child components update unnecessarily

This can hurt performance, responsiveness, and even battery usage on mobile devices.

Without memoization every update causes new rendering work - even for unchanged content.

With memoization Vue can skip rendering when dependencies stay the same which reduces DOM operations, Virtual DOM diffing, and in general component work.

🟢 What Is v-memo in Vue?

v-memo is a Vue directive that memoizes part of a template.

Basic example:

<div v-memo="[value]">
  {{ expensiveContent }}
</div>
Enter fullscreen mode Exit fullscreen mode

Vue will only re-render this block when value changes. Otherwise Vue reuses the previous rendered result.

Let’s imagine a large user list.

Without v-memo

<script setup lang="ts">
const users = ref([
  { id: 1, name: 'John' },
  { id: 2, name: 'Alice' }
])

const counter = ref(0)
</script>

<template>
  <button @click="counter++">
    {{ counter }}
  </button>

  <div
    v-for="user in users"
    :key="user.id"
  >
    {{ user.name }}
  </div>
</template>
Enter fullscreen mode Exit fullscreen mode

Every counter update re-renders the whole list even though users never changed.

With v-memo we can:

<script setup lang="ts">
const users = ref([
  { id: 1, name: 'John' },
  { id: 2, name: 'Alice' }
])

const counter = ref(0)
</script>

<template>
  <button @click="counter++">
    {{ counter }}
  </button>

  <div
    v-for="user in users"
    :key="user.id"
    v-memo="[user.id]"
  >
    {{ user.name }}
  </div>
</template>
Enter fullscreen mode Exit fullscreen mode

And now counter updates still happen but unchanged list items are skipped. This becomes extremely valuable for large lists, dashboards, or tables.

🟢 When NOT to Use It

v-memo is not needed everywhere as Vue is already highly optimized.

Avoid using it for tiny components, static content, or premature optimization as overusing memoization can:

  • reduce readability
  • make debugging harder
  • introduce stale UI bugs

🧪 Best Practices

  • Use v-memo only for measurable bottlenecks
  • Great for large dynamic lists
  • Keep dependency arrays minimal
  • Avoid premature optimization
  • Profile performance before optimizing
  • Combine with virtual scrolling for huge datasets
  • Prefer stable keys and predictable state updates

📖 Learn more

If you would like to learn more about Vue, Nuxt, JavaScript or other useful technologies, checkout VueSchool by clicking this link or by clicking the image below:

Vue School Link

It covers most important concepts while building modern Vue or Nuxt applications that can help you in your daily work or side projects 😉

🧪 Advance skills

A certification boosts your skills, builds credibility, and opens doors to new opportunities. Whether you're advancing your career or switching paths, it's a smart step toward success.

Check out Certificates.dev by clicking this link or by clicking the image below:

Certificates.dev Link

Invest in yourself—get certified in Vue.js, JavaScript, Nuxt, Angular, React, and more!

✅ Summary

Memoization is a powerful optimization technique that helps avoid unnecessary work.

In this article, you learned:

  • What memoization is
  • What problem it solves
  • How Vue’s v-memo works
  • Practical examples for lists and components
  • When to use it — and when not to

Take care!
And happy coding as always 🖥️

Top comments (0)