Capítulo 7 de 11

Tutorial VueJS 3 – Propiedades computadas con computed

verificado el 2 septiembre 2026 · 4 min

Respuesta rápida

computed() declara un valor derivado de otros valores. Vue guarda el resultado en caché y solo lo recalcula si cambia una dependencia, al contrario que una función llamada desde la plantilla, que se ejecuta en cada renderizado. Una propiedad computada debe ser pura: lee y devuelve, sin efectos secundarios.

Al final de este capítulo, sabrás deducir un valor a partir del estado en lugar de mantenerlo actualizado a mano.

Una propiedad computada es un valor derivado de otros valores. Vue lo recalcula cuando cambia una de sus dependencias, y solo en ese momento. Es la herramienta que mantiene la lógica fuera de la plantilla.

Un primer cálculo

La ficha tiene que mostrar la marca y el producto. Se podría hacer en la plantilla:

html
<h1>{{ brand + ' ' + product }}</h1>

Funciona, pero la lógica se dispersa por el HTML. Declara mejor una propiedad computada:

src/App.vue
<script setup>
import { computed, ref } from 'vue'

const product = ref('T-Shirt')
const brand = ref('Gekkode')

const title = computed(() => `${brand.value} ${product.value}`)
</script>

<template>
  <h1>{{ title }}</h1>
</template>

computed recibe una función y devuelve una referencia de solo lectura. En el script se lee title.value, en la plantilla, {{ title }}, igual que con un ref.

La caché

Es la verdadera diferencia con una función normal. Una propiedad computada guarda su resultado y solo lo recalcula si ha cambiado alguna de sus dependencias.

html
<!-- appelée à chaque rendu, même si rien n’a changé -->
<p>{{ calculerTitre() }}</p>

<!-- calculée une fois, puis relue depuis le cache -->
<p>{{ title }}</p>

En una concatenación, la diferencia es nula. En una ordenación o un filtro aplicados a varios cientos de entradas, y mostrados en tres sitios de la página, se nota mucho.

Controlar la variante seleccionada

Pasemos a un caso útil. Ahora cada variante tiene su propia cantidad en stock:

src/App.vue
<script setup>
const variants = ref([
  { id: 2234, color: '#2563eb', image: '/images/t-shirt-bleu.svg', quantity: 20 },
  { id: 2235, color: '#dc2626', image: '/images/t-shirt-rouge.svg', quantity: 0 }
])
</script>

El azul está disponible, el rojo no. La imagen mostrada y la disponibilidad dependen ahora las dos de la variante sobre la que pasa el ratón. En lugar de mantener dos variables al día a mano, guardemos un único dato: cuál está seleccionada.

src/App.vue
<script setup>
const selectedVariant = ref(0)

function updateVariant(index) {
  selectedVariant.value = index
}
</script>

El bucle transmite el índice, recuperado como en el capítulo 4:

src/App.vue
<div
  v-for="(variant, index) in variants"
  :key="variant.id"
  class="color-circle"
  :style="{ backgroundColor: variant.color }"
  @mouseover="updateVariant(index)"
></div>

El resto se deduce. image e inStock ya no son datos, sino cálculos:

src/App.vue
<script setup>
const image = computed(() => variants.value[selectedVariant.value].image)
const inStock = computed(() => variants.value[selectedVariant.value].quantity > 0)
</script>

Pasa el ratón por el círculo rojo: la imagen cambia, el mensaje pasa a «En rupture» y el botón se atenúa gracias a la vinculación de clases. Solo ha cambiado una variable, los tres elementos la han seguido.

Devuelve un booleano, no un número

Escribir computed(() => variants.value[selectedVariant.value].quantity) parece funcionar: una cantidad de 0 es falsa, una cantidad de 20 es verdadera. Pero entonces inStock vale 20, y si algún día lo muestras con {{ inStock }}, la página enseñará «20». Compara explícitamente con > 0.

Cuándo usar una propiedad computada

  • Un valor derivado del estado: total de un carrito, lista filtrada, texto montado. Es el caso normal.
  • No para un efecto secundario. Una propiedad computada debe ser una función pura: lee y devuelve. No modifica nada, no llama a ninguna API, no dispara ninguna petición. Para eso están watch y watchEffect.
  • No para un valor que cambia solo, como la hora actual: nada avisaría a Vue de que hay que recalcular.

Una propiedad computada de escritura

Por defecto, una propiedad computada es de solo lectura. Vue avisa en la consola si intentas asignarle un valor. Para los casos en los que escribir tiene sentido, proporciona un par get / set:

javascript
const nomComplet = computed({
  get: () => `${prenom.value} ${nom.value}`,
  set: (valeur) => {
    [prenom.value, nom.value] = valeur.split(' ')
  }
})
En la Options API

Las propiedades computadas viven en la opción computed y leen el estado a través de this: computed: { title() { return this.brand + ' ' + this.product } }. El principio de la caché es el mismo.

EjercicioAñade una propiedad computada resume que devuelva «Gekkode T-Shirt, azul, en stock» a partir de la variante seleccionada. Después comprueba con un console.log dentro de la función que no se recalcula en cada renderizado.

Errores frecuentes

Devolver un número en lugar de un booleano Una cantidad de 0 es falsa y una cantidad de 20 es verdadera, así que el código parece funcionar. Pero mostrar el valor enseñaría «20». Compara explícitamente: quantity > 0.
Meter un efecto secundario en una propiedad computada Una llamada de red o un cambio de estado se dispararía ahí de forma imprevisible. Usa watch o watchEffect.
Asignar un valor a una propiedad computada Es de solo lectura por defecto, Vue avisa en la consola. Proporciona un par get/set si escribir tiene sentido.
Newsletter

Las nuevas pruebas, tutoriales y proyectos, por correo.

Pruebas reproducibles, código versionado, resultados fechados. Nunca spam.