Sintaxis de Plantilla
Texto y Expresiones
{{ message }} {{ count + 1 }} {{ ok ? 'Yes' : 'No' }}
Directivas
{{ expr }}Interpolación de texto
v-bind:attr / :attrEnlazar atributo a expresión
v-on:event / @eventAdjuntar escuchador de evento
v-modelEnlace bidireccional (formularios)
v-if / v-else-if / v-elseRenderizado condicional
v-showAlternar CSS de visualización (permanece en DOM)
v-forRenderizado de lista
v-slot / #nameContenido de slot con nombre
Enlace de Atributos
Reactividad
ref (Primitivos)
import { ref } from 'vue' const count = ref(0) console.log(count.value) // 0 count.value++ // reactive update
reactive (Objetos)
import { reactive } from 'vue' const state = reactive({ count: 0, name: 'Vue' }) state.count++ // no .value needed
ref vs reactive
ref()Cualquier tipo; acceder via .value en script
reactive()Solo objetos/arreglos; acceso directo a propiedades
TemplateAmbos se desenvuelven automáticamente (sin .value)
Destructurereactive pierde reactividad; usar toRefs()
Computed y Watchers
Propiedades Computed
import { ref, computed } from 'vue' const items = ref([1, 2, 3, 4, 5]) const evenItems = computed(() => items.value.filter(n => n % 2 === 0) )

Los valores computed se almacenan en caché y solo se revalúan cuando cambian sus dependencias

Watchers
import { ref, watch, watchEffect } from 'vue' const query = ref('') // Watch specific source watch(query, (newVal, oldVal) => { console.log(`Changed: ${oldVal} → ${newVal}`) }) // Auto-track dependencies watchEffect(() => { console.log(`Query is: ${query.value}`) })
Opciones de Watch
immediate: trueEjecutar callback inmediatamente al crear
deep: trueObservar objetos anidados profundamente
flush: 'post'Ejecutar después de actualización del DOM
once: trueDisparar solo una vez y detenerse
Componentes
Componente de Archivo Único (SFC)
Registrar Componentes
Bloques SFC
<script setup>API de composición (recomendado)
<template>Plantilla HTML
<style scoped>CSS con alcance de componente
<style module>Módulos CSS (objeto $style)
Props y Eventos
Definir Props
Emitir Eventos
Uso en Padre
v-model en Componentes
Slots
Slot Predeterminado

Custom content here

Slots con Nombre

Main content

Slots con Alcance
API de Composición
Función Composable
// useMouse.js import { ref, onMounted, onUnmounted } from 'vue' export function useMouse() { const x = ref(0) const y = ref(0) function update(e) { x.value = e.pageX y.value = e.pageY } onMounted(() => window.addEventListener('mousemove', update)) onUnmounted(() => window.removeEventListener('mousemove', update)) return { x, y } }
Usar Composables
provide / inject
// Parent import { provide, ref } from 'vue' const theme = ref('dark') provide('theme', theme) // Descendant (any depth) import { inject } from 'vue' const theme = inject('theme', 'light') // default
Router (Vue Router)
Definiciones de Ruta
import { createRouter, createWebHistory } from 'vue-router' const router = createRouter({ history: createWebHistory(), routes: [ { path: '/', component: Home }, { path: '/about', component: About }, { path: '/user/:id', component: User }, ] })
Navegación en Plantilla
Home User 1
Navegación Programática
import { useRouter, useRoute } from 'vue-router' const router = useRouter() const route = useRoute() router.push('/about') router.push({ name: 'user', params: { id: 1 } }) console.log(route.params.id)
Características de Ruta
/user/:idSegmento dinámico (route.params.id)
name: 'user'Ruta con nombre para navegación programática
children: [...]Rutas anidadas
beforeEnterGuarda de navegación por ruta
meta: { auth: true }Metadatos personalizados para guardas
redirect: '/new-path'Redirección de ruta
Hooks de Ciclo de Vida
Orden de Hooks
onBeforeMountAntes del renderizado inicial del DOM
onMountedDOM listo (obtener datos, añadir escuchadores)
onBeforeUpdateAntes de que el estado reactivo rerenderice el DOM
onUpdatedDespués del rerenderizado del DOM
onBeforeUnmountAntes de que el componente sea destruido
onUnmountedLimpieza (eliminar escuchadores, temporizadores)
Uso
Listas y Condicionales
v-for
  • {{ item.name }}
  • {{ index }}: {{ item.name }}
  • {{ key }}: {{ val }}

    Siempre usar :key con v-for para actualizaciones eficientes del DOM

    v-if vs v-show
    v-ifRenderizar condicionalmente (añadir/eliminar del DOM)
    v-else-ifCadena else-if
    v-elseRama de respaldo
    v-showAlternar display: none (permanece en DOM)

    Usar v-show para alternancias frecuentes, v-if para cambios poco frecuentes

    Ejemplo de Condicionales
    Loading...
    Error!
    {{ data }}
    Manejo de Formularios
    Fundamentos de v-model
    Modificadores de v-model
    v-model.lazySincronizar en change en lugar de input
    v-model.numberAuto-convertir a número
    v-model.trimAuto-eliminar espacios en blanco
    Modificadores de Evento
    @click.preventLlamar preventDefault()
    @click.stopLlamar stopPropagation()
    @click.onceDisparar como máximo una vez
    @keyup.enterSolo en tecla Enter
    @submit.preventPrevenir envío predeterminado del formulario