Files
agent-skills/skills/vue-best-practices/reference/computed-vs-methods-caching.md
Jason Woltje f5792c40be feat: Complete fleet — 94 skills across 10+ domains
Pulled ALL skills from 15 source repositories:
- anthropics/skills: 16 (docs, design, MCP, testing)
- obra/superpowers: 14 (TDD, debugging, agents, planning)
- coreyhaines31/marketingskills: 25 (marketing, CRO, SEO, growth)
- better-auth/skills: 5 (auth patterns)
- vercel-labs/agent-skills: 5 (React, design, Vercel)
- antfu/skills: 16 (Vue, Vite, Vitest, pnpm, Turborepo)
- Plus 13 individual skills from various repos

Mosaic Stack is not limited to coding — the Orchestrator and
subagents serve coding, business, design, marketing, writing,
logistics, analysis, and more.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 16:27:42 -06:00

3.6 KiB

title, impact, impactDescription, type, tags
title impact impactDescription type tags
Use Computed Properties for Cached Reactive Derivations MEDIUM Methods recalculate on every render while computed properties cache results efficiency
vue3
computed
methods
performance
caching

Use Computed Properties for Cached Reactive Derivations

Impact: MEDIUM - Computed properties are cached based on their reactive dependencies and only re-evaluate when dependencies change. Methods run on every component re-render, causing performance issues for expensive operations.

When you need to derive a value from reactive state, prefer computed properties over methods for automatic caching and optimized re-renders.

Task Checklist

  • Use computed properties for values derived from reactive state
  • Use methods only when you need to pass parameters or don't want caching
  • Never use computed for non-reactive values like Date.now()
  • Consider performance impact of expensive operations in methods vs computed

Incorrect:

<template>
  <!-- BAD: Method runs on every re-render -->
  <p>{{ getFilteredItems() }}</p>
  <p>{{ calculateTotal() }}</p>
  <p>{{ getCurrentTime() }}</p>
</template>

<script setup>
import { ref } from 'vue'

const items = ref([/* large array */])
const prices = ref([100, 200, 300])

// BAD: Expensive operation runs every render
function getFilteredItems() {
  return items.value
    .filter(item => item.active)
    .sort((a, b) => a.name.localeCompare(b.name))
}

// BAD: Calculation runs every render even if prices unchanged
function calculateTotal() {
  return prices.value.reduce((sum, price) => sum + price, 0)
}

// This looks like a computed use case, but Date.now() is non-reactive
function getCurrentTime() {
  return Date.now()  // Will appear to work but won't update reactively
}
</script>

Correct:

<template>
  <!-- GOOD: Computed only recalculates when items change -->
  <p>{{ filteredItems }}</p>
  <p>{{ total }}</p>
  <!-- GOOD: Method for non-reactive current time -->
  <p>{{ getCurrentTime() }}</p>
</template>

<script setup>
import { ref, computed } from 'vue'

const items = ref([/* large array */])
const prices = ref([100, 200, 300])

// GOOD: Cached - only recalculates when items.value changes
const filteredItems = computed(() => {
  return items.value
    .filter(item => item.active)
    .sort((a, b) => a.name.localeCompare(b.name))
})

// GOOD: Cached - only recalculates when prices change
const total = computed(() => {
  return prices.value.reduce((sum, price) => sum + price, 0)
})

// GOOD: Use method for non-reactive values
// (or use setInterval to update a ref)
function getCurrentTime() {
  return Date.now()
}
</script>

When to Use Each

Scenario Use Computed Use Method
Derived from reactive state Yes No
Expensive calculation Yes No
Need to pass parameters No Yes
Non-reactive value (Date.now()) No Yes
Don't want caching No Yes
Triggered by user action No Yes

Non-Reactive Values Warning

Computed properties only track reactive dependencies. Non-reactive values like Date.now() will cause the computed to be evaluated once and never update:

// BAD: Date.now() is not reactive - computed will never update
const now = computed(() => Date.now())

// GOOD: Use a ref with setInterval for live time
const now = ref(Date.now())
setInterval(() => {
  now.value = Date.now()
}, 1000)

Reference