<img :src="`https://static.coincap.io/assets/icons/${a.symbol.toLowerCase()}@2x.png`" :alt="a.name">
Introducción
Qué aprenderás sobre Vue.js 2
El Framework Progresivo
¡Hola Vue!
Rendering Declarativo y Manipulación de DOM
Introducción al Rendering Declarativo
Expresiones y Propiedades
Atributos Dinámicos
Control de Flujo con Directivas
Renderizado de Listas
Manejo de Eventos
Clases en tiempo real
Estilos en tiempo real
Computed Properties y Watchers
Two-Way Data Binding
Ejercicios de práctica módulo 2
Sistema de Componentes
Sistema de Componentes
Crear Componentes Custom
Comunicación entre Componentes: propiedades
Comunicación entre Componentes: eventos
Slots
Ciclo de Vida y Hooks
Antes de continuar, ¡un repaso!
Ejercicios de práctica
Ambiente de Desarrollo
VS Code + Vetur / Chrome / Firefox + Dev Tools
Qué es, cómo usarlo y aplicaciones profesionales con el CLI
Single File Components
Funcionalidades, UI y comandos básicos
Platzi Exchange
Introducción y Setup de Tailwind CSS
Primeros Componentes
Introducción y Setup de Vue Router
Introducción a Fetch y API de Coincap
Mejorar la UI con filtros
Rutas dinámicas
Navegación Programática
Utilizar componentes de terceros
Problemas de Reactividad
Mejorar proyecto: filtros y ordenar
Mejorar proyecto: links y conversión
¡A producción!
Despliegue de la app a Netlify
Rendering Declarativo y Manipulacion de DOM
You don't have access to this class
Keep learning! Join and start boosting your career
In web programming, the use of APIs to interact with servers and retrieve data is fundamental. One of the most valuable tools in this environment is fetch
, a modern functionality widely supported by almost all browsers.
Fetch allows HTTP requests to be made easily and efficiently without relying on external libraries. This is ideal for projects that seek to maintain a lightweight and efficient framework.
To exemplify the use of fetch
, let's create an implementation that interacts with the CoinCap API. This service allows you to access various cryptocurrency-related features, such as getting lists of assets, reading their details, and more. In our project, we will create a function that fetches
a list of cryptocurrencies using fetch
.
// We define the base API URLconst apiUrl = 'https://api.coincap.io/v2';
// Function to fetch a list of cryptocurrenciesasync function getAssets() { const response = await fetch(`${apiUrl}/assets?limit=20`); const data = await response.json(); return data.data; // We will return the cryptocurrency data}
This code makes a request to the API to get a maximum of twenty assets. The use of template strings facilitates the dynamic construction of URLs, allowing to customize requests according to the needs of the project.
Once the API data has been obtained, the next step is to integrate it into a Vue.js component. To do this, we must first import the function that accesses the API and then store the data in a property of the component's state.
import { getAssets } from '@/api'; // We import the previously defined function
export default { data() { return { assets: [] // Property to store the assets }; }, async created() { this.assets = await getAssets(); // We assign the data obtained when the component is loaded }}
This pattern allows that, when the component is mounted in the interface, it automatically accesses the CoinCap API, obtains the data, and stores it to be used in the view.
To visualize the obtained data, we will use directives like v-for
in Vue templates to render each cryptocurrency in a table. This technique is efficient and allows us to handle large volumes of data in an orderly manner.
<table> <thead> <tr> <th>Image</th> <th>Name</th> <th>Price</th> <th>Range</th> <th>Variation</th> </tr> </thead> <tbody> <tr v-for="asset in assets" :key="asset.id"><td><img :src="`https://api.coincap.io/assets/icons/${asset.symbol.toLowerCase()}@2x.png`" :alt="asset.name"/></td> <td>{{ asset.name }}</td> <td>${{ asset.priceUsd }}</td> <td>{{ asset.rank }}</td> <td>{{ asset.changePercent24Hr }}%</td> </tr></tbody></table></table>.
With this approach, each cryptocurrency is presented with its image, name, price, range and 24-hour variation. The structure is clear and well organized, making it easy to manage the data in the interface.
To ensure a clean and maintainable code, tools such as ESLint and Prettier are indispensable. They allow you to standardize the code style and correct errors automatically. A .prettierrc
file is configured to set the preferred rules.
{ " semi": false, " singleQuote": true}
With this, we can customize aspects such as the use of single quotes and the removal of semicolons, aligning the project with our stylistic preferences.
By the end of this guide, you have learned how to work efficiently with fetch
, integrating data into Vue components, and ensuring code quality with linter tools. Keep exploring and experimenting with these methodologies to develop robust and dynamic applications - your curiosity and dedication are your best allies in learning!
Contributions 52
Questions 18
<img :src="`https://static.coincap.io/assets/icons/${a.symbol.toLowerCase()}@2x.png`" :alt="a.name">
Tuve un problema con la vista, me aparecía el thead en un lado y tbody al otro, como si fueran dos columnas, lo solucioné metiendo todo el contenido del template en un div. Lo escribo por si alguien más le sucediera.
Si examinan el API en Postman sabran por que no les deja obtener las respuestas, lo que tienen que hacer es colocar toda la url directamente en la variable
const url = "https://api.coincap.io/v2/assets?limit=20";
function getAssets() {
return fetch(`${url}`)
.then(res => res.json())
.then(res => res.data);
}
export default {
getAssets
};
Una de las cosas que más me pareció interesantes de la clase es que está usando al hook created() para hacer la solicitud a la API, lo cual es interesante, porque aquí es donde te das cuenta cómo puedes usar el ciclo de vida del componente
Hola Devs:
-Aca les tengo la implementacion de la API con Async y Await:
-Y les muestro como integre la API al Home con un metodo y usando Async y Await:
-Si desean saber mas, les paso el commit exacto de estos cambios: Click Aqui
Recuerden, #NuncaParesDeAprender 💚
No podía lograr que funcione el fetch en mi caso tenia algun problema con el cross origin o similar, luego de un largo research logré resolverlo así:
const url = "https://api.coincap.io/v2";
function getAssets()
{
return getRequest("assets?limit=20");
}
function getRequest(method)
{
return fetch(`${url}/${method}`, {
mode: "cors",
method: "GET",
headers: {
"Accept": "application/json"
}
})
.then(response => response.json())
.then((response) => {
return response.data;
})
.catch(error => { console.log('request failed', error); }); // Syntax error: unexpected end of input
}
export default { getAssets };
Tuve un error con los cors o algo así , y lo solucioné de la siguiente manera
function getAssets() {
return fetch(`${url}/assets?limit=20`, {
mode: "cors",
method: "GET",
headers: {
Accept: "application/json",
},
})
.then((res) => res.json())
.then((res) => res.data);
}
Por si a alguien le sale un error mencionando a:
“core-js/modules/es.object.to-string”
Cambien los preset de babel.config.js por esto:
module.exports = {
presets: [["@vue/app", { useBuiltIns: “entry” }]]
};
por si alguien tiene un problema con la imagen del dragon que sale mas grande que las otras , solo añadan esto
img {
height: 64px;
}
Si deean tener documentada su API, como la de CoinCap, es a través de Postman. Les dejo un enlace de Platzi hacia el Curso de Postman
Parece ser que no existen las imagenes de los bitcoins en la API.
https://static.coincap.io/assets/icons/BTC@2x.png
Cuando intento abrir el link me sale el ‘404’
la mejor explicacion facil y sencilla de como consumir una api con vue.
La visualización de números es un poco compleja, así que decidí agregar 2 funciones en el componente de la tabla para darles formato.
<template>
<table>
<thead>
<tr class="bg-gray-100 border-b-2 border-gray-400">
<th></th>
<th>
<span>Ranking</span>
</th>
<th>Nombre</th>
<th>Precio</th>
<th>Cap. de Mercado</th>
<th>Variación 24hs</th>
<td class="hidden sm:block"></td>
</tr>
</thead>
<tbody>
<tr
class="border-b border-gray-200 hover:bg-gray-100 hover:bg-orange-100"
v-for="(asset, idx) in assets"
:key="`asset-${idx}`"
>
<img
:src="`https://static.coincap.io/assets/icons/${asset.symbol.toLowerCase()}@2x.png`"
:alt="asset.name"
style="max-height: 65px"
>
<td>
<b>
#{{ asset.rank }}
</b>
</td>
<td>{{ asset.name }}</td>
<td>{{ currencyFormater(asset.priceUsd) }}</td>
<td>{{ numberFormat(asset.marketCapUsd) }}</td>
<td>{{ numberFormat(asset.changePercent24Hr) }}</td>
<td class="hidden sm:block"></td>
</tr>
</tbody>
</table>
</template>
<script>
export default {
name: 'PxAssetsTable',
props: {
assets: {
type: Array,
default: () => [],
},
},
methods: {
currencyFormater(val) {
return Intl.NumberFormat('en-US', { currency: 'USD', style: 'currency' }).format(val);
},
numberFormat(val) {
if (val) {
return parseFloat(val).toLocaleString();
}
return val;
},
},
};
</script>
Código usado:
API:
const url = "https://api.coincap.io/v2";
Imagen:
<img :src="`https://static.coincap.io/assets/icons/${a.symbol.toLowerCase()}@2x.png`"
:alt="a.name" />
Para que no tener problemas con la imagen solo agreguen:
<img
class="w-16 h-16"
:src="
`https://static.coincap.io/assets/icons/${a.symbol.toLowerCase()}@2x.png`
"
:alt="a.name"
/>
Para obtener en “tiempo real” los cambios del API, define por ejemplo getData() en los methods:
getData(){
api.getCryptos().then(data => {
this.cryptos = data;
})
}
Y luego en mounted() define un setInterval() que llame a getData() cada segundo por ejemplo:
mounted(){
setInterval(()=>{
this.getData()
},
1000);
}
Esto referescara con datos nuevos cada segundo desde coincap.
A mi particularmente me parece mas ordenado y comprensible usar async await y arrow functions. Les dejo como quedaria el codigo utilizando estas features:
const getAssets = async () => {
try {
const rawData = await fetch(`${baseUrl}/assets?limit=20`);
const jsonData = await rawData.json();
return jsonData;
} catch (error) {
console.error("El request a la api no fue correcto");
}
};
Muy buena esta clase. Pasó algo en la API, una de las imágenes es más grande que las otras jajaja
Si la imagen de la tabla no se muestra, pueden reducir el padding del media query a 10px
@media (min-width: 640px) {
td,
th {
padding: 10px;
font-size: 1rem;
}
th {
padding: 12px;
}
}
no entendi como trae la imagen… que tiene que ver ese @x2.png??
Una forma moderna de user fetch con arrow functions:
const url = "https://api.coincap.io/v2";
const getAssets = async () => {
try {
const response = await fetch(`${url}/assets?limit=20`);
const { data } = await response.json();
return data;
} catch (error) {
console.error(`¡Ocurrió un error con el API!: ${error}`);
}
};
export default {
getAssets,
};
const url = 'https://api.coincap.io/v2';
const getAssets = () => {
console.log(`${url}/assets?limit=20`)
return fetch(`${url}/assets?limit=20`)
.then(response => response.json())
.then(data => console.log(data));
}
export default getAssets()
Lo haces ver muy fácil 😂
ayudaa!! me sale este error llevo horas sin solucionarlo 😦
¿Como puedo hacer para que el eslint me resalte los errores o lo que está fallando como a Nacho? en mi caso no lo hace 😦
Leyendo un poco, la sencilla y practica integración de Vue y Axios se ha vuelto una elección común para desarrolladores que requieren incluir consumos HTTP en el flujo de trabajo, sería muy interesante ampliar este tema de consumo de API.
Explicado de una forma concisa y muy clara.
Utilizamos el hook created para hacer la llamada a la API
no entiendo como obtuviste la imagen… busque en coincap y no sale por ningun lado
++ vocación para enseñar
Si como yo, prefieren las comiilas simples, en vez de dobles, asì se configura prettier para ello:
{
"semi": false,
"singleQuote": true,
"arrowParens": "avoid",
"printWidth": 120
}
Source de la imagen:
:src="https://static.coincap.io/assets/icons/${a.symbol.toLowerCase()}@2x.png
"
Gente, si tienen problemas por que no pueden ver los assets cuando hacen click en el componente Home, si tienen addblock instalado, interfiere con la extension de Vue. Se recomienda parar addblock en el sitio que estan visitando
No se si configure algo mal al momento de configurar prettier o lint, pero tuve que hacer esto para que al momento de guardar le hiciera un fix automatico, tienen que ir a settings.json y poner lo siguiente
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": true
},
"eslint.validate": ["javascript"]
}
Espero le sirva a alguien
Para hacer peticiones HTTP
recomiendo Axios porque es isomórfico. Eso significa que puedes hacer peticiones desde el cliente como desde el servidor.
.
En otras palabras, si has intentado usar fetch con Node.js, verás que la consola te regresa error porque fetch sólo funciona desde el navegador. Para solucionar este problema usé axios porque funciona en ambos lados.
.
Puedes instalarlo localmente con npm
, por ejemplo, o usarlo embebido en tu HTML.
estuve probando los codigos de los comentarios me funciono con las “promises” pero luego quise ver porque no me funciono como lo hacia en el video aqui dejo mi codigo para que funcione.
Esta siempre ha sido mi mas grande debilidad, el llamado de API’s 😦
Yo use Axios en vez de Fetch me parece super VueJs y lo flexible que puede llegar hacer.
Por si tienen algun error que tiene que ver con algo como: “TypeError: Object(…) is not a function” y tienen exactamente el mismo codigo de la clase, intenten con reiniciar el server, supongo que tiene que ver con que algunos registros no se actualizan y siguen apareciendo los mismos errores.
Un error al momento de no poder obtener la data de la api es que en then de la promesa no se llama al metodo json correctamente, recuerden poner res.json() no res.json.
const url = 'https://api.coincap.io/v2';
function getAssets() {
return fetch(`${url}/assets?limit=20`)
.then((res) => res.json())
.then((res) => res.data);
}
export default {
getAssets,
};
buenas tardes por aquí, Nacho tengo ya varios días!
con un error, he revisado todo el código, lo hago tal cual la clase pero nada que soluciono, si me puedes ayudar o alguien pueda. gracias!
y si el api, no responde por “x” razón!, ¿como mostrar que un msn de error? de no es posible consultar la información en este momento.
B.U.E.N.I.S.I.M.O.
que es eso del query string donde pusiste un limite de 20? es interesante
Aun con el mismo error, quien me ayuda? gracias
No se si es una pregunta sin sentido. Pero estoy haciendo un Ecommerce con Vue. ¿Existe alguna API pública de productos fake que yo pueda consumir para ir probando mi APP?
Mientras hago mi propia API.
Me encantó la facilidad y simplicidad con la que explicó el Fetch.
Generalmente hacen un “drama” por el fetch… Este profe lo explicó en menos de 10 segundos y quedo más claro que clases de 1 hora.
👌
Cuando los proyectos crecen y hay que hacer muchas llamadas a un servidor, usualmente se utiliza la librería axios para realizar las peticiones HTTP. Es una librería de lo más fácil de utilizar.
Want to see more contributions, questions and answers from the community?