Acordaros de utilizar fechas recientes en tiempo real al momento que veis este video. Ya que si poneis las mismas fechas que la clase, os devolvera un NaN y por ende, un error.
Introducción
Construye una aplicación para el control de tus gastos con Vue.js
Creación del proyecto
Setup inicial
Splashscreen
Header y contenido
Layout
Vista
Resumen de datos
Agregando formato a la moneda
Componente del historial
Lista del historial
El botón para agregar
Formulario para agregar
Gráfico
Creación del SVG del gráfico
Creación de las coordenadas en el gráfico
Creación de la lógica del gráfico
Creando la interacción con el gráfico
Modelo
Modelo de datos
Agregar y quitar
Persistencia del modelo
Últimos detalles de nuestra aplicación
Cierre
Poniendo nuestra aplicación en producción en Netlify
¿Quieres más cursos de Vue?
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Convierte tus certificados en títulos universitarios en USA
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Diana Martínez
Aportes 11
Preguntas 3
Acordaros de utilizar fechas recientes en tiempo real al momento que veis este video. Ya que si poneis las mismas fechas que la clase, os devolvera un NaN y por ende, un error.
El código quedó incompleto en el vídeo justo al final.
Gente, si se quedaron esperando que pasara con el emit, no se preocupen, solo borrén esa línea que van por el emit que dentro de 2 clases se hará ese emit
también es posible calcular el valor de amount sin utilizar el map, haciendo uso de filter
y reduce
.
creo que la ventaja de esta solución es que no estamos recorriendo el arreglo en cada iteración del map, sino que estamos siempre tomado el ultimo elemento de la lista y usandolo para crear el nuevo elemento
amounts() {
return this.movements
.filter(({ time }) => {
const today = new Date();
const oldDate = today.setDate(today.getDate() - 30);
return time > oldDate;
})
.reduce((acc, { amount }) => {
return acc.length ? [...acc, acc[acc.length - 1] + amount] : [amount];
}, []);
},
Toda la función computada amounts
se pudo haber hecho en un solo return sin separar en variables, aprovechando el argumento array
que contiene los métodos de arrays.
array
.filter()
.map((element, index, array) => {
// donde el array de este map no es el array inicial sino el array resultante hasta el uso de este método
})
.
La diferencia de días entre fecha la he hecho con el método .getTime()
(documentación) que me devuelve en milisegundos el tiempo que hay desde el 1 de enero de 1970 hasta la fecha deseada. Luego calculo la diferencia de fechas y obtengo lo que deseo:
array..filter((movement) => {
const daysDiff = (today.getTime() - movement.date.getTime()) / (1000 * 60 * 60 * 24);
return daysDiff <= 30;
})
.
Recordar también que para obtener el acumulado de los movimientos en donde cortamos el array con slice(init, fin)
este debe ser cortado en el monto con índice i + 1
ya que el método nunca toma el fin para el recorte (documentación)
.
.map((_, i, lastDays) => {
const lastMovements = lastDays.slice(0, i + 1);
return lastMovements.reduce((accAmount, amount) => accAmount + amount, 0);
});
.
Les comparto mi reposiorio si quieren revisarlo, espero que les guste:
.
Reposirorio commit actual: Click aquí
Asi lo hice yo
computed: {
amounts() {
const lastDays = this.movements.reduce((acc, item, index) => {
const today = new Date();
const oldDate = today.setDate(today.getDate() - 30);
if (item.date >= oldDate) {
if (index != 0) {
acc.push(acc[index - 1] + item.amount)
} else {
acc.push(item.amount);
}
}
return acc;
}, [])
//agregue un cero al inicio de la lista solo para comenzar con ese punto
lastDays.unshift(0);
return lastDays;
}
}
Tuve problemas al registrar decimales y como mis gastos llevan decimales tuve que encontrar la forma. la solucion es convertir las sumatorias a float
Datos de Movements
movements: [
{
id: 0,
title: "Movimiento 1",
description: "Lorem ipsum dolor sit amet",
amount: 100,
time: new Date("02-01-2022"),
},
{
id: 1,
title: "Movimiento 2",
description: "Lorem ipsum dolor sit amet",
amount: 200,
time: new Date("02-01-2022"),
},
{
id: 2,
title: "Movimiento 3",
description: "Lorem ipsum dolor sit amet",
amount: 500,
time: new Date("02-01-2022"),
},
{
id: 3,
title: "Movimiento 4",
description: "Lorem ipsum dolor sit amet",
amount: 200,
time: new Date("02-01-2022"),
},
{
id: 4,
title: "Movimiento 5",
description: "Lorem ipsum dolor sit amet",
amount: -400,
time: new Date("02-01-2022"),
},
{
id: 5,
title: "Movimiento 6",
description: "Lorem ipsum dolor sit amet",
amount: -600,
time: new Date("02-01-2022"),
},
{
id: 6,
title: "Movimiento 7",
description: "Lorem ipsum dolor sit amet",
amount: -300,
time: new Date("02-01-2022"),
},
{
id: 7,
title: "Movimiento 8",
description: "Lorem ipsum dolor sit amet",
amount: 100,
time: new Date("02-01-2022"),
},
{
id: 8,
title: "Movimiento 9",
description: "Lorem ipsum dolor sit amet",
amount: 300,
time: new Date("01-01-2022"),
},
{
id: 9,
title: "Movimiento 10",
description: "Lorem ipsum dolor sit amet",
amount: 500,
time: new Date("01-01-2022"),
},
],
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?