我试图在vue-图表中使用反应性数据混合
用于设置初始数据的挂载函数正在工作,我可以使用API响应正确地看到图表:
fetchSessionTrends() {
axios.get(endpoint)
.then(({data}) => {
this.sessions = data.map(session => session.sessions);
this.sessionLabels = data.map(label => label.date);
this.loaded = true;
});
},数据:
data() {
return {
endpoint: 'public/api/sessions',
sessions: [],
sessionLabels: [],
loaded: false,
daysFilter: 14
};
},我用文本字段显示图表,以提供反应性部分--期望它再次调用端点并接收新的响应。
<div class="col-md-2 session-filter">
<div class="input-group">
<input type="text" class="form-control" placeholder="days..." v-model="daysFilter">
<span class="input-group-btn">
<button class="btn btn-secondary" type="button" @click="refreshSessions">Go</button>
</span>
</div>
</div>
<line-chart v-if="loaded" :chart-data="sessions" :chart-labels="sessionLabels"></line-chart>不过,为了测试反应性部分,现在我只是直接更改数据数组,看看它是如何工作的:
refreshSessions() {
this.sessions = [1, 2, 3];
this.sessionlabels = ["june", "july", "august"];
},对,所以这给了我错误
[Vue warn]: Error in callback for watcher "chartData": "TypeError: Cannot read property 'map' of undefined" found in ....
TypeError: Cannot read property 'map' of undefinedLineChart.js如docs中所述,在这里缩写为空格。
import { Line, mixins } from 'vue-chartjs';
const { reactiveProp } = mixins
extends: Line,
mixins: [reactiveProp],
props: {
chartData: {
type: Array,
required: true
},
chartLabels: {
type: Array,
required: true
}
},
mounted() {
this.renderChart({
labels: this.chartLabels,
datasets: [
{
label: 'sessions',
data: this.chartData
}
]
}, this.options)
}因此,图表一开始运行良好,但我似乎无法让反应部分发挥作用。
发布于 2017-11-29 12:28:06
这不管用。因为reactiveMixins假定chartData是整个chartjs数据集对象。使用数据集数组、标签等。
但是你要把它分开,这样reactiveMixins就不能工作了。因为您的chartData只是一个数据集的纯数据。
要解决这个问题,你可以做两件事:
我想最简单的方法是添加两个观察者来观察chartData和chartLabel,以及在一个更改调用中添加this.$data._chart.update()
https://stackoverflow.com/questions/47278617
复制相似问题