【发布时间】:2021-05-28 07:07:19
【问题描述】:
正如我在标题中提到的,我想使用 api 初始化 Chart.js 图表。我找到了教程,但它们大多在呈现页面后更新数据。我想在页面呈现之前更新图表。所以我直接看到初始化图表没有重新加载。
<template>
<h3>Stacked</h3>
<Chart type="bar" v-if="isReady" :data="stackedData" :options="stackedOptions"/>
</template>
<script>
import axios from "axios";
import {defineComponent, ref} from 'vue';
export default {
data() {
return {
isReady: false,
stackedData: {
labels: ['A', 'B', 'C', 'D'],
datasets: [{
type: 'bar',
label: 'Something',
backgroundColor: '#42A5F5',
data: this.list_all
}, {
type: 'bar',
label: 'Another',
backgroundColor: '#66BB6A',
data: this.list_intersection
}]
},
stackedOptions: {
tooltips: {
mode: 'index',
intersect: false
},
responsive: true,
scales: {
xAxes: [{
stacked: true,
}],
yAxes: [{
stacked: true
}]
}
},
basicOptions: null,
//---------------------------------------------------
all:[]
list_intersection:[],
list_all:[]
}
},
beforeCreate() {
let apiKaderURL = 'http://localhost:4000/apiKader';
axios.get(apiKaderURL).then(res => {
this.all = res.data;
this.saveData()
this.isReady=true;
}).catch(error => {
console.log(error)
});
},
methods:{
saveData: function (){
for (var i in this.all){
if(this.all[i].id==='2' ){
this.list_all.push(this.all[i].someNumber)
}
if(this.all[i].id==='8'){
this.list_intersection.push(this.all[i].someNumber)
}
}
return this.list_all && this.list_intersection
}
}
}
</script>
我只是尝试使用 axios 获取值,过滤它们,然后将它们返回到图表对象的数据属性,以便使用这些值进行初始化。
我想,因为我调用了beforeCreate,它应该可以工作,因为我在渲染之前初始化了值但是图表没有显示任何值。
我也尝试过使用vue-chartjs,但我认为它不能真正使用 Vue 3,或者我做错了什么。
我怎样才能做到这一点? 非常感谢您。
【问题讨论】:
-
如果
v-if没有帮助,问题不在于(a)同步性。你能显示<chart>组件吗? -
我只是将它导入到 main.js 中,正如这里提到的 primefaces.org/primevue/showcase/#/chart 。我必须自己定义组件吗?
-
请检查这个 GiHub 问题页面github.com/apertureless/vue-chartjs/issues/379chartJS 对数据更改没有反应
-
@FilipKováč 好的,谢谢。我认为正如这里提到的stackoverflow.com/questions/64114215/… 库现在似乎不支持 vue 3。我之前也尝试过使用它,但我遇到了很多问题。有其他选择吗?
-
如果您能够从 Primevue 文档中获取示例,那么您的代码也没有明显的理由不应该与
v-if一起使用,除非某些数据/选项格式不正确。跨度>
标签: javascript vue.js chart.js vue-component vuejs3