Cómo conectar servicios a componentes Vue
Clase 22 de 53 • Curso Profesional de Vue.js 2
Contenido del curso
CLI y Dev Tools
- 3

Instalación de Vue.js: Node, Dev Tools y CLI
06:13 min - 4

Crear una aplicación Vue con CLI y webpack
12:49 min - 5

Cómo funciona webpack.config.js
10:38 min - 6

Babel: transpilador de JavaScript moderno
05:06 min - 7

ESLint con Standard JS: linteo automático en webpack
15:34 min - 8

Configuración de Sass y Bulma en Vue
06:18 min - 9

Cómo configurar Pug en Vue con webpack
04:23 min - 10
Diseño de Mockups: Práctica y Colaboración en Comunidad
00:20 min - 11
Creación de Vistas con Mockups y Vue.js
00:32 min
Manipulación del DOM
- 12

Expresiones en Vue: sintaxis doble llave
03:49 min - 13

Diferencia entre v-show y v-if en el DOM
06:22 min - 14

Qué es data binding en Vue.js
04:11 min - 15

Computed properties en Vue.js: cómo crearlas
04:13 min - 16

Qué son los watchers de Vue
02:25 min - 17

Eventos Vue: directiva v-on y métodos format
06:12 min - 18

Cómo construir una interfaz de búsqueda completa en Vue
19:03 min - 19
Manipulación del DOM con Vue.js: Práctica y Ejercicios
03:00 min
REST y HTTP
Sistema de Componentes
- 23

Cómo crear componentes en Vue
08:46 min - 24

Componentes Layout en Vue con Bulma
09:50 min - 25

Reactividad en Vue: $set y Object.assign
06:14 min - 26

Hooks del ciclo de vida en Vue.js
05:38 min - 27

Comunicación padre-hijo con props en Vue
23:27 min - 28

Eventos en Vue: comunicar hijo a padre
12:04 min - 29

Slots: HTML dinámico en componentes Vue
13:42 min - 30

Plugin Event Bus: comunicar componentes sin relación en Vue
19:19 min
Vue Router
Extendiendo VueJS
Clases, Animaciones y Transiciones36
Vuex
- 39

Cómo Vuex centraliza estados en Vue
03:41 min - 40

Instalación de Vuex con estado único
17:32 min - 41

Cómo usar mutations y commit en Vuex
08:16 min - 42

Getters de Vuex: mapGetters y store sincronizado
07:35 min - 43

Cómo dispatch ejecuta actions asincrónicas en ViewX
07:54 min - 44

Instalación de Viewex en Platzi Music
26:37 min
Nuxt.js
Deploy a Producción con Now
Conclusiones
Bonus
Conecta tu servicio de búsqueda a tu componente en Vue con seguridad y claridad. Aquí verás cómo importar TrackService, reemplazar datos hardcodeados, manejar promises, depurar con console, resolver errores de CORS por URLs incorrectas y probar el endpoint con Postman o curl. Además, pulimos la vista con mejoras de Pug y validaciones en JavaScript usando valores falsy y truthy.
¿Cómo conectar servicios y view models en Vue?
Para usar el servicio en el componente principal, se importa TrackService desde la carpeta services sin necesidad de la extensión; webpack la resuelve. Se elimina el array hardcodeado y se usa el evento click con data binding para invocar el método de búsqueda. El método Search recibe la searchQuery, retorna una promise y permite encadenar un then para procesar la respuesta y hacer console.log.
// app.vue (fragmento)
import TrackService from './services/track'
export default {
data() {
return {
searchQuery: '',
tracks: []
}
},
methods: {
onSearch() {
if (!this.searchQuery) return
TrackService.search(this.searchQuery)
.then(res => {
console.log(res)
this.tracks = res.tracks.items
})
}
}
}
- Importar el servicio desde services/track.
- Usar el método Search con la variable bindeada al input.
- Encadenar then para leer la respuesta y observarla en console.
- Asignar los items a this.tracks para renderizar resultados.
¿Por qué usar then para procesar la respuesta?
- Porque Search devuelve una promise.
- Permite inspeccionar la API HTTP con console.log y luego actualizar el estado.
¿Qué errores comunes y soluciones aparecen al consumir una API?
Aparecen dos situaciones típicas: un import mal nombrado y un falso error CORS causado por una URL incorrecta. En el import, el archivo real se llama Platzi-Music, no Platzi Music Service; al corregir el nombre, webpack recompila y el componente funciona. Si ves CORS, revisa la URL base: se requiere HTTPS y el nombre correcto de la API: Platzi-Music-API.
- Corregir el import: usar el nombre exacto del archivo.
- Cambiar a HTTPS y a la ruta de Platzi-Music-API.
- Probar el endpoint con un cliente HTTP.
Ejemplo de prueba con cliente HTTP:
- Método: GET.
- Ruta: /search.
- Parámetros: q=muchacha, type=track.
Resultado esperado: un objeto con tracks e items. Para enlazarlo al view model:
// asignación al estado del componente
this.tracks = res.tracks.items
Para mostrar el artista, la respuesta expone artists (colección), no artist. Se usa el primer elemento y su name:
//- Pug (fragmento de template)
li(v-for="track in tracks")
| {{ track.name }} - {{ track.artists[0].name }}
¿Cómo verificar fácilmente los endpoints?
- Usar curl o Postman para reproducir la petición.
- En Postman: método GET, ruta /search, query string con q y type.
- Comparar la respuesta con la que ves en console.
¿Cómo mejorar el código y la UX con pequeñas refactorizaciones?
Se aplican ajustes de Pug y estilos para legibilidad. Para evitar scroll horizontal, se mueven bloques y se agregan nodos de texto con el pipe (|), ya que sin él Pug intenta renderizar un elemento inexistente. Se reorganiza el search message (una computed property) fuera de la navbar dentro de un container. Además, se corrige un error de sintaxis en una clase column y se agrega una validación para no buscar con input vacío, aprovechando valores falsy y truthy.
//- usar pipe para texto
.column
| Resultados encontrados
// validación sencilla con valores falsy
onSearch() {
if (!this.searchQuery) return
return TrackService.search(this.searchQuery)
.then(res => { this.tracks = res.tracks.items })
}
- Pipe en Pug para apendear texto sin crear etiquetas inválidas.
- Mover el mensaje de encontrados fuera de la navbar a un container.
- Corregir la clase column para aplicar márgenes y estilos.
- Prevenir búsquedas vacías con if (!this.searchQuery) return.
¿Tienes otra API REST que te gustaría integrar? Prueba el reto similar y comparte tu código y aprendizajes en los comentarios.