Progressive Framework

Vue

Vue es el framework progresivo: adopta tan poco o tanto como necesites, con una sintaxis de plantillas que se siente como escribir HTML y una reactividad que simplemente funciona.

intermediate15 min readUpdated 15 sept 2026
Counter.vue
vue
<!-- Counter.vue -->
<script setup>
import { ref } from "vue";

const count = ref(0);
</script>

<template>
  <button @click="count++">
    Clicked {{ count }} times
  </button>
</template>
Primer lanzamiento
2014, por Evan You
Versión mayor actual
Vue 3
Modelo
Progressive framework
Reactividad
ref, reactive, computed
Componentes
Archivos .vue de archivo único
Herramientas
Vite, Nuxt, Vue Router, Pinia

Por que importa

Por qué a los desarrolladores les gusta Vue

Plantillas accesibles

La sintaxis de plantillas es HTML con algunas directivas, por lo que los diseñadores y principiantes pueden leer un componente sin tener que aprender JSX primero.

Reactividad automática

Cambia un valor y la vista se actualiza. Vue rastrea las dependencias por ti, así que no hay diffing manual ni setState.

Adopción gradual

Añade Vue a una sola página con una etiqueta script, o construye una aplicación completa con Nuxt. El mismo modelo escala en ambas direcciones.

La imagen completa

Las tres ideas detrás de Vue

Una plantilla, un sistema de reactividad y componentes de archivo único. Vue mantiene la primera accesible y hace que la segunda sea invisible.

Templates

Marcado

HTML extendido con directivas como v-if, v-for y v-model que vinculan la vista con tus datos.

Reactivity

Datos

ref y reactive hacen que los valores sean observables, mientras que computed y watch responden a los cambios.

Components

Composición

Los componentes de archivo único mantienen la plantilla, la lógica y los estilos scoped juntos en un solo archivo .vue.

Vue de un vistazo

El núcleo de Vue

Componentes de archivo único

Plantilla, script y estilo scoped en un solo archivo .vue.

Sintaxis de plantillas

Interpolación con llaves dobles y directivas como v-if y v-for.

ref y reactive

Las dos primitivas de reactividad para manejar el estado en la Composition API.

computed y watch

Deriva valores automáticamente o ejecuta efectos secundarios cuando algo cambia.

Props y emits

Pasa datos hacia abajo con props y envía eventos hacia arriba con emits.

La Composition API

Agrupa la lógica por funcionalidad en script setup en lugar de dispersarla en opciones.

Una breve historia

De proyecto paralelo a uno de los tres frameworks principales

  1. 2014

    Vue 1

    Evan You lanza Vue después de trabajar en Angular, buscando un framework más ligero y accesible.

    14
  2. 2016

    Vue 2

    El virtual DOM y un ecosistema próspero convierten a Vue en uno de los frameworks más populares del mundo.

    16
  3. 2020

    Vue 3

    Llegan la Composition API, un mejor soporte para TypeScript y un sistema de reactividad más rápido.

    20
  4. 2022

    script setup

    Una macro del compilador que hace que la Composition API sea concisa y se convierta en el estándar recomendado.

    22
  5. Hoy

    Un favorito estable

    Vue sigue siendo una opción principal para equipos que buscan potencia sin una curva de aprendizaje pronunciada.

    Hoy

La guia completa

Vue: Todo lo que necesitas saber

¿Qué es Vue?

Vue es un framework de JavaScript progresivo para construir interfaces de usuario. La palabra es deliberada: puedes integrar Vue en una sola página para mejorar un widget, o utilizarlo con una herramienta de construcción para crear una aplicación completa. No es necesario reescribir el código para obtener valor, y el framework crece según tus necesidades.

En esencia, Vue consta de dos elementos: una sintaxis de plantillas que extiende HTML y un sistema de reactividad que rastrea tus datos y actualiza la vista automáticamente. Tú declaras qué debe mostrar la UI y Vue se encarga de mantenerla sincronizada.

Single-file components

Un componente de Vue normalmente reside en un archivo .vue con tres bloques: un template, un script y estilos. Mantenerlos juntos convierte al componente en una unidad única y autónoma.

<!-- Card.vue -->
<script setup>
defineProps({ title: String });
</script>

<template>
  <article class="card">
    <h3>{{ title }}</h3>
    <slot />
  </article>
</template>

<style scoped>
.card {
  border-radius: 1rem;
  padding: 1.5rem;
}
</style>

<style scoped> limita automáticamente el CSS a este componente, evitando que los nombres de las clases se filtren hacia afuera. <script setup> es una macro del compilador que hace que la Composition API sea concisa y es el estándar moderno.

Sintaxis de plantillas

Las plantillas de Vue son HTML con un pequeño conjunto de directivas. La interpolación utiliza llaves dobles y las directivas son atributos prefijados con v-.

<!-- profile.vue -->
<template>
  <h1>{{ user.name }}</h1>
  <p v-if="user.online">Online</p>
  <p v-else>Offline</p>

  <ul>
    <li v-for="post in posts" :key="post.id">
      {{ post.title }}
    </li>
  </ul>

  <img :src="user.avatar" :alt="user.name" />
  <button @click="follow">Follow</button>
</template>

Lee las abreviaciones de la siguiente manera: :src vincula un atributo a una expresión y @click escucha un evento. v-if renderiza condicionalmente y v-for realiza bucles con un :key para actualizaciones eficientes. La plantilla se compila en funciones de renderizado, aunque rara vez necesitarás verlas.

Reactividad: ref y reactive

El sistema de reactividad de Vue supervisa tus datos y vuelve a renderizar la interfaz cuando estos cambian. En la Composition API, creas valores reactivos con ref o reactive.

<script setup>
import { ref, reactive } from "vue";

const count = ref(0);           // .value in script
const user = reactive({         // proxy, no .value
  name: "Ada",
  online: true,
});

function increment() {
  count.value += 1;
}
</script>

ref envuelve cualquier valor y se accede a él a través de .value en el script, aunque las plantillas lo desempaquetan automáticamente por ti. reactive devuelve un proxy profundamente reactivo para un objeto. Una convención común es utilizar ref de manera consistente, ya que funciona con primitivos y es fácil de reasignar.

Computed y watch

Existen dos funciones para manejar valores derivados y efectos secundarios.

<script setup>
import { ref, computed, watch } from "vue";

const items = ref([10, 20, 30]);

const total = computed(() =>
  items.value.reduce((sum, n) => sum + n, 0),
);

watch(items, (next, prev) => {
  console.log("items changed", prev, next);
});
</script>

computed almacena su resultado en caché y lo recalcula solo cuando cambia una dependencia; úsalo siempre que un valor derive de otro estado. watch ejecuta un callback cuando cambia una fuente y se utiliza para efectos secundarios como el logging, peticiones de datos o guardado. Un error común es recurrir a watch para calcular un valor.

Props, emits y slots

Los datos fluyen hacia abajo a través de props y hacia arriba mediante eventos emitidos.

<!-- Child.vue -->
<script setup>
const props = defineProps({
  label: { type: String, required: true },
});
const emit = defineEmits(["select"]);

function handleClick() {
  emit("select", props.label);
}
</script>

<template>
  <button @click="handleClick">{{ label }}</button>
</template>
<!-- Parent.vue -->
<Child label="Save" @select="onSelect" />

Las props son de solo lectura en el componente hijo, lo que mantiene la fuente de verdad en el padre. Los slots permiten que un padre pase marcado a un hijo, el equivalente a children de React.

Composables

La mayor ventaja de la Composition API es la lógica reutilizable. Un composable es una función que utiliza reactividad y devuelve un estado, nombrada con el prefijo use.

// useFetch.js
import { ref, watchEffect } from "vue";

export function useFetch(url) {
  const data = ref(null);
  const error = ref(null);

  watchEffect(async () => {
    data.value = null;
    error.value = null;
    try {
      const res = await fetch(url.value);
      data.value = await res.json();
    } catch (err) {
      error.value = err;
    }
  });

  return { data, error };
}

Los composables comparten la lógica, no el estado, por lo que cada componente que llama a useFetch obtiene sus propios datos independientes. Este es el equivalente en Vue a un custom hook.

Enrutamiento y estado

Vue Router gestiona la navegación mediante un mapeo declarativo de URL a componente, y Pinia es el store oficial para el estado compartido.

// router.js
import { createRouter, createWebHistory } from "vue-router";

export const router = createRouter({
  history: createWebHistory(),
  routes: [
    { path: "/", component: Home },
    { path: "/users/:id", component: UserProfile },
  ],
});

Utiliza un store cuando varios componentes distantes necesiten el mismo estado. Para datos locales o entre padres e hijos, las props y los composables suelen ser suficientes.

Mejores prácticas

  • Usa script setup y la Composition API para el código nuevo.
  • Prefiere computed sobre watch para los valores derivados.
  • Mantén las props como solo lectura y emite eventos para los cambios.
  • Extrae la lógica reutilizable en composables.
  • Usa estilos scoped, o CSS Modules, para mantener los estilos locales.
  • Nombra los composables con el prefijo use.
  • Evita acceder al estado de los componentes hijos; comunícate a través de props y emits.

Errores comunes

  • Olvidar .value en una ref dentro de script.
  • Usar watch para calcular un valor que computed debería derivar.
  • Mutar props en un componente hijo en lugar de emitir un evento.
  • Desestructurar un objeto reactive y perder la reactividad.
  • Poner todo el estado en un store global cuando el estado local sería suficiente.
  • Mezclar la Options API y la Composition API sin una razón clara.

Próximos pasos

Vue es una puerta de entrada sencilla a los frameworks de componentes y es capaz de escalar en cualquier proyecto. Añade Nuxt para el renderizado en el servidor y convenciones de routing, compara este enfoque con React y Svelte, y mantén tus conocimientos de JavaScript al día. Después, construye algo pequeño —una lista filtrable o un formulario con validación— y deja que la reactividad haga el trabajo por ti.

Valores derivados

Usa computed para valores que dependen de otro estado. watch es para efectos secundarios, no para cálculos.

Preferir
const items = ref([1, 2, 3]);
const total = computed(() =>
  items.value.reduce((a, b) => a + b, 0),
);
Evitar
const total = ref(0);
watch(items, () => {
  total.value = items.value.reduce(
    (a, b) => a + b, 0,
  );
});

Vinculación de inputs

v-model maneja el valor y el evento de actualización, para que no tengas que conectarlos a mano.

Preferir
<input v-model="query" />

<script setup>
const query = ref("");
</script>
Evitar
<input
  :value="query"
  @input="query = $event.target.value"
/>

Preguntas frecuentes

Preguntas frecuentes

Keep learning

Related topics from the roadmap.

$ comienza a aprender

Listo para aprender Vue?

Nuestro tutorial interactivo te guia a traves de Vue paso a paso — con quizzes y codigo real que puedes ejecutar en el navegador.