Memoização no Vue.js: Estratégias e Comparação com React

A memoização é uma técnica poderosa para otimizar aplicações e, no ecossistema Vue.js, ela é mais integrada e natural do que muitas pessoas imaginam. Embora React exija estratégias explícitas como useMemo e React.memo, o Vue já vem com mecanismos de cache reativo embutidos, além de ferramentas adicionais para controle fino de renderizações.

Vamos explorar como memoização funciona no Vue.js, suas formas de implementação, vantagens e riscos, e algumas diferenças práticas em relação ao React.

Foto de Mohammad Rahmani na Unsplash

Reatividade no Vue: Memoização “automática”

A base do Vue é sua reatividade granular. Sempre que você define um computed, o Vue:

  • Monitora automaticamente suas dependências;
  • Recalcula o valor apenas quando alguma dependência muda;
  • Retorna o valor armazenado em cache caso contrário.
JavaScript
<script setup>
import { ref, computed } from 'vue'

const firstName = ref('Luigi')
const lastName = ref('Moretti')

// Computed já vem memoizado por padrão
const fullName = computed(() => {
  console.log('Recalculando fullName...')
  return `${firstName.value} ${lastName.value}`
})
</script>

<template>
  <p>{{ fullName }}</p>
  <button @click="firstName = 'Luigi'">Forçar Re-render</button>
</template>

Neste exemplo, o log só aparece quando firstName ou lastName mudam. Qualquer outro re-render não recalcula fullName.

Breve comparação com o React:

JavaScript
const fullName = useMemo(() => `${firstName} ${lastName}`, [firstName, lastName])

Enquanto React exige useMemo explicitamente, Vue faz isso automaticamente com computed.


watchEffect e memoization reativa

Outro recurso importante é o watchEffect. Ele executa efeitos colaterais reativos, rastreando automaticamente suas dependências, sem precisar declará-las manualmente.

JavaScript
import { watchEffect } from 'vue'

watchEffect(() => {
  console.log('fullName mudou:', fullName.value)
})

Diferente de computed, watchEffect não armazena valor memoizado, mas é útil para reagir a mudanças com precisão (como logs, chamadas de API ou side effects).


Memoization manual para funções puras

Em alguns cenários, especialmente fora da árvore reativa do Vue, você pode usar memoization manual, como faria em JavaScript puro.

JavaScript
function memoize(fn) {
  const cache = new Map()
  return function(arg) {
    if (cache.has(arg)) {
      return cache.get(arg)
    }
    const result = fn(arg)
    cache.set(arg, result)
    return result
  }
}

const expensiveCalculation = memoize((num) => {
  console.log('Executando cálculo pesado...')
  return num ** 2
})

const number = ref(4)
const result = computed(() => expensiveCalculation(number.value))

✅ Ideal para cálculos pesados reutilizáveis que não dependem de reatividade direta.
🚫 Evite cachear dados altamente dinâmicos, pois isso pode aumentar consumo de memória desnecessariamente.


Controlando reatividade com shallowRef e shallowReactive

Por padrão, Vue faz reatividade profunda, ou seja, qualquer alteração interna em objetos ou arrays dispara atualizações.

Com shallowRef e shallowReactive, você controla manualmente quando o Vue deve re-renderizar, semelhante a como React.memo evita renders desnecessários.

JavaScript
import { shallowRef } from 'vue'

const data = shallowRef({ value: 0 })

// Alterações internas não disparam re-render
data.value.value = 10

// Trocar a referência dispara
data.value = { value: 20 }

Isso é útil para otimizar componentes complexos, como tabelas ou gráficos.


v-memo: memoização declarativa no template (Vue 3.2+)

Introduzido no Vue 3.2, v-memo permite memoizar blocos de template com base em dependências específicas — assim como React.memo para componentes.

JavaScript
<template>
  <div v-memo="[user.id]">
    <!-- Este bloco só será re-renderizado quando user.id mudar -->
    <UserProfile :user="user" />
  </div>
</template>

✅ Útil para listas grandes, componentes caros ou partes da UI que raramente mudam.
⚠️ Deve ser usado com critério: v-memo não substitui arquitetura bem projetada.


Comparando memoization: Vue vs React

RecursoVue.jsReact
ComputedAutomáticoRequer useMemo
Cache de dependênciasAutomáticoManual com array de dependências
Template memoizationv-memo (Vue 3.2+)React.memo
Controle granularshallowRef / shallowReactivememo + memoization manual
Efeitos reativoswatchEffectuseEffect

No Vue, a memoização é parte da arquitetura, enquanto no React ela é uma ferramenta extra para controle de performance.

Se você deseja entender melhor como funciona essa técnica no React, escrevi um post detalhando um pouco mais. Confira no link abaixo:


Cuidados e riscos da memoização no Vue

  • Evite otimizar prematuramente: Vue já é eficiente em updates granulares.
  • Memoization consome memória, especialmente caches manuais.
  • v-memo mal usado pode mascarar problemas de arquitetura.
  • computed excessivamente aninhados podem gerar complexidade e overhead.
  • Prefira clareza antes de micro-otimizações.

Compatibilidade

RecursoVue 2Vue 3Observações
computedCore
watchEffectComposition API
shallowRef / shallowReactivePerformance granular
v-memo✅ (3.3+)Similar a React.memo
Memoization manualJS nativo

Conclusão

A memoização no Vue.js é mais natural e integrada que no React, graças ao seu modelo reativo granular.
Ferramentas como computed, watchEffect, shallowRef e v-memo tornam possível controlar com precisão quando e como partes da UI são recalculadas.

Antes de aplicar memoization manual, pergunte-se:

  • Essa operação é realmente custosa?
  • O Vue já não está otimizando isso por mim?
  • Há ganho real de performance medido?

🔸 Dica final: Use o DevTools do Vue para inspecionar re-renderizações antes de aplicar memoização manual.


📢 Curtiu essa explicação?
Me siga no LinkedIn para mais conteúdos práticos sobre desenvolvimento frontend.


Referências