La Evolución del Componente Vue: De Opciones a Composición, y Ahora `script setup`
Para apreciar verdaderamente el valor de `script setup`, es útil entender el camino que ha recorrido Vue.js.
Originalmente, Vue 2 nos introdujo a la `Options API`, un enfoque declarativo donde la lógica de los componentes se organizaba en propiedades predefinidas como `data`, `methods`, `computed`, `watch` y `lifecycle hooks`. Este método es intuitivo para componentes pequeños y medianos, pero a medida que las aplicaciones crecen y la lógica se vuelve más compleja, la `Options API` puede llevar a lo que se conoce como "lógica fragmentada". Es decir, las características relacionadas pueden dispersarse por todo el componente, dificultando su comprensión y mantenimiento.
Vue 3, respondiendo a estas preocupaciones, introdujo la `Composition API`. Esta API permite organizar la lógica de los componentes basándose en la funcionalidad, en lugar de las opciones. Permite extraer y reutilizar lógica reactiva a través de funciones componibles (`composables`), lo que mejora enormemente la modularidad y la escalabilidad. La `Composition API` se utiliza dentro de un método `setup()` especial en el componente.
Sin embargo, incluso con la `Composition API`, el método `setup()` requería que explícitamente se hicieran disponibles las variables, funciones y propiedades computadas al template a través de una sentencia `return`. Esto, aunque funcional, aún añadía un pequeño fragmento de boilerplate. Y aquí es donde `script setup` brilla con luz propia.
Decodificando `script setup`: Una Declaración Más Clara y Concisa
`script setup` es un "azúcar sintáctico" (`syntactic sugar`) para la `Composition API` dentro de los componentes Single File Components (SFCs) de Vue. En esencia, permite escribir la lógica de la `Composition API` directamente en la sección `Lista de Usuarios
Cargando usuarios...
{{ error }}
No se encontraron usuarios para su búsqueda.
-
{{ user.name }}
Email: {{ user.email }}
Teléfono: {{ user.phone }}
Ciudad: {{ user.address.city }}
Contactar
Paso 3: Integrar `UserList` en `App.vue`
Ahora, para ver nuestro componente en acción, necesitamos importarlo y usarlo en `src/App.vue`. Limpien el contenido existente de `App.vue` y reemplácenlo con lo siguiente: ```htmlExplicación del Código `UserList.vue`
1. **`import { ref, reactive, computed, watch, onMounted } from 'vue';`**: Importamos las funciones necesarias de Vue.js. Gracias a `script setup`, estas funciones se pueden usar directamente sin calificarlas con `this`. 2. **`const users = ref([]);`**: Creamos una referencia reactiva `users` que inicialmente es un array vacío. Aquí es donde almacenaremos la lista de usuarios obtenida de la API. Usamos `ref` porque el valor completo del array `users` puede ser reasignado. 3. **`const searchTerm = ref('');`**: Otra referencia reactiva para almacenar el texto que el usuario introduce en la barra de búsqueda. 4. **`const isLoading = ref(true);` y `const error = ref(null);`**: Referencias para manejar los estados de carga y error, cruciales para una buena experiencia de usuario. 5. **`const fetchUsers = async () => { ... };`**: Esta función asíncrona realiza la llamada a la API de JSONPlaceholder para obtener los datos de los usuarios. Envuelve la lógica en un bloque `try-catch` para manejar posibles errores de red o del servidor, y actualiza los estados `isLoading` y `error` apropiadamente. 6. **`const filteredUsers = computed(() => { ... });`**: Aquí está el corazón de nuestra lógica de búsqueda reactiva. `computed` crea una nueva lista de usuarios (`filteredUsers`) que se actualiza automáticamente cada vez que `users.value` o `searchTerm.value` cambian. Si no hay término de búsqueda, devuelve todos los usuarios. De lo contrario, filtra los usuarios cuyo nombre o email incluyen el `searchTerm` (insensible a mayúsculas/minúsculas). Usar `computed` es fundamental aquí para la eficiencia, ya que la función de filtrado solo se ejecuta cuando sus dependencias cambian. 7. **`watch(searchTerm, (newValue, oldValue) => { ... });`**: Utilizamos `watch` para observar el `searchTerm`. Cada vez que cambia, se ejecuta la función de callback. En este caso, simplemente registramos el cambio en la consola. Esto es un ejemplo sencillo; en una aplicación real, `watch` podría usarse para guardar el término de búsqueda en el almacenamiento local, realizar una búsqueda en un servidor cuando el término alcanza una longitud mínima, o cualquier otro efecto secundario. 8. **`onMounted(() => { fetchUsers(); });`**: Este es un `lifecycle hook`. La función `fetchUsers()` se llama una vez que el componente ha sido montado en el DOM, asegurando que los usuarios se carguen tan pronto como el componente esté listo para mostrarse. Esto es equivalente al `mounted()` de la Options API. 9. **Template (``):** * El input de búsqueda (``) está enlazado directamente a nuestra `searchTerm` reactiva. * La lista de usuarios (`- `) itera sobre `filteredUsers`, lo que significa que siempre mostrará la lista de usuarios que coincide con el término de búsqueda actual.
* También hemos añadido lógica condicional (`v-if`, `v-else-if`, `v-else`) para mostrar mensajes de carga, error o sin resultados, mejorando la experiencia del usuario.
¡Y eso es todo! Con `script setup`, todo el código de la `Composition API` reside directamente en el `