Issue
I'm trying to make a Chart with Google Charts using Vue.js library, but I don't know how to add to the div.
Here what I'm had tried to do, this is how to add a chart with vanilla javascript (Here the code example of the documentation), I tried to adapt to vue, but nothing happenned:
google.charts.load('current', {'packages': ['corechart']});
Vue.component('line-char', {
data: function(){
// Create the data table.
var data = google.visualization.arrayToDataTable([
['Tiempo', 'Temperatura'],
[1, 1000],
[2, 1170],
[3, 660],
[4, 1030]
]);
// Set chart options
var options = {
'title': 'Data Line',
'width': '100%',
'height': 250,
legend: { position: 'bottom' }
};
// Instantiate and draw our chart, passing in some options.
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
},
template: '<div v-model="chart_div"></div>'
});
html:
<div id="component">
<line-chart></line-chart>
</div>
Solution
What you'll want to do is use a ref
for your <div>
and then register a callback to draw the chart in your component's mounted
hook.
// Load library
google.charts.load('current', {'packages':['corechart']})
const lineChartOptions = {
title: 'Data Line',
width: '100%',
height: 250,
legend: { position: 'bottom' }
}
Vue.component('LineChart', {
template: `<div ref="chart"></div>`, // 👈 set ref here
data: () => ({
headings: ['Tiempo', 'Temperatura'],
chartData: [
[1, 1000],
[2, 1170],
[3, 660],
[4, 1030]
]
}),
methods: {
drawChart () {
const dataTable = google.visualization.arrayToDataTable([
this.headings,
...this.chartData
], false) // 👈 don't forget "false" here to indicate the first row as labels
const chart = new google.visualization.LineChart(this.$refs.chart) // 👈 use ref here
chart.draw(dataTable, lineChartOptions)
}
}
mounted () {
// set the library loaded callback here
google.charts.setOnLoadCallback(() => this.drawChart())
}
})
As mentioned by Matt, if your component's template is truly empty save for a single <div>
, you can use the $el
property to mount the chart without bothering with refs
Vue.component('LineChart', {
template: `<div></div>`,
// ...
methods: {
drawChart () {
// ...
const chart = new google.visualization.LineChart(this.$el)
chart.draw(this.dataTable, options)
}
}
})
Answered By - Phil
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.