SPA-приложение на Vue.JS #4
Привет, сегодня мы научимся получать данные с помощью axios и отрисовывать графики с помощью ChartJS.
AXIOS
Начнём с подключения axios и простого get-запроса для получения данных. Подключить axios можно в файлике main.js:
import axios from 'axios' import VueAxios from 'vue-axios' Vue.use(VueAxios, axios)
Теперь перейдём в файлик Total.vue и попробуем получить данные, для начала давайте просто выведем их на экран, чтобы точно понимать, что данные получены и всё хорошо (создайте в data () переменную continents и выведите её в самом верху страницы, но внутри тега main). Теперь мы можем использовать axios (не забудьте про this!) внутри mounted ().
mounted () {
this.axios
.get('https://corona.lmao.ninja/v2/continents?sort')
.then(response => { this.continents = response; this.updateStats() })
.catch(error => { console.error('An API error: ', error) })
}Методы на сегодня (мы используем NovelCovidAPI):
Первый метод: https://corona.lmao.ninja/v2/continents?sort
Второй метод: https://corona.lmao.ninja/v2/historical?all
Все открытые API можно взять здесь: https://covid-19-apis.postman.com/
Внутри methods создаём функцию:
updateStats () {
let data = this.continents.data
let cases = 0
let deaths = 0
let recoveries = 0
for (let elem of data) {
cases += elem.cases
deaths += elem.deaths
recoveries += elem.recovered
}
this.cards[0].amount += cases
this.cards[1].amount += deaths
this.cards[2].amount += recoveries
}Reactive props
import Vue from 'vue'
import { Line, mixins } from 'vue-chartjs'
const { reactiveProp } = mixins
export default Vue.component('line-chart', {
extends: Line,
props: {
options: Object
},
mixins: [reactiveProp],
mounted () {
this.renderChart(this.chartData, this.options)
}
})Теперь мы можем налету менять данные в графике (кроме этого, здесь мы можем добавить данные за последние 24 часа к нашим карточкам):
updateVisuals () {
let data = this.allData.data
let cases = data.cases
let deaths = data.deaths
let recoveries = data.recovered
let labels = []
let casesPerDay = []
let deathsPerDay = []
let recoveriesPerDay = []
for (let key in cases) {
labels.push(key)
casesPerDay.push(cases[key])
deathsPerDay.push(deaths[key])
recoveriesPerDay.push(recoveries[key])
}
console.log(labels)
console.log(casesPerDay)
this.visuals[0].chartData = {
labels: labels,
datasets: [{
label: 'Total cases',
backgroundColor: '#6aaaff',
data: casesPerDay
}]
}
this.visuals.push({
id: 2,
chartData: {
labels: labels,
datasets: [{
label: 'Deaths',
backgroundColor: '#ff5252',
data: deathsPerDay
}]
},
options: { responsive: true, maintainAspectRatio: false }
})
this.visuals.push({
id: 3,
chartData: {
labels: labels,
datasets: [{
label: 'recoveries',
backgroundColor: '#26a69a',
data: recoveriesPerDay
}]
},
options: { responsive: true, maintainAspectRatio: false }
})
let lastDayCases = casesPerDay[casesPerDay.length - 1] - casesPerDay[casesPerDay.length - 2]
let lastDayDeaths = deathsPerDay[deathsPerDay.length - 1] - deathsPerDay[deathsPerDay.length - 2]
let lastDayRecoveries = recoveriesPerDay[recoveriesPerDay.length - 1] - recoveriesPerDay[recoveriesPerDay.length - 2]
this.cards[0].amountNew += lastDayCases
this.cards[1].amountNew += lastDayDeaths
this.cards[2].amountNew += lastDayRecoveries
}