【发布时间】:2019-09-19 13:28:37
【问题描述】:
遗憾的是,我又遇到了一些 Vue.js 反应性问题。目前,我的代码在mounted() 上渲染一次图表,然后每次数据更新时都会重新渲染图表,这要感谢观察者。这确实有效(除了我不确定如何删除以前渲染的图表这一事实),但是,考虑到我使用的是 Vue,我不确定这是否是进行更新的正确方法。对我来说,在数据更新时更新已经渲染的图表似乎是一个更好的选择,而不是渲染一个全新的图表并删除旧的图表。
我尝试使用this.data = the new data 更改数据,但是,我知道这不会使对象反应。我也尝试使用 this.$set ,如此处所述 - https://vuejs.org/v2/guide/reactivity.html ,但是,我没有用它实现任何目标。我可能没有正确使用它。我还尝试仅更改对象的一个属性,该属性也不会影响图表。
<template>
<div id="app">
<button @click="updateChart()">X</button>
<canvas id="myChart"></canvas>
</div>
</template>
<script>
export default {
data: function() {
return {
data: {
labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'],
datasets: [{
label: '# of Votes',
data: [12, 19, 3, 5, 2, 3]
}],
}
}
},
methods: {
updateChart(){
this.data = {
labels: ['Red', 'Red', 'Red', 'Red', 'Red', 'Red'],
datasets: [{
label: 'EYOOOOOOOOOOOOOO',
data: [6, 7, 8, 9, 10, 11]
}],
}
/*this.$set(this.data, {
labels: ['Red', 'Red', 'Red', 'Red', 'Red', 'Red'],
datasets: [{
label: 'Please Work',
data: [6, 7, 8, 9, 10, 11]
}],
}))*/
/*this.$set(this.data, 'labels', ['Red', 'Red', 'Red', 'Red', 'Red', 'Red'])*/
},
renderChart(data, options){
var ctx = document.getElementById('myChart').getContext('2d');
var myChart = new Chart(ctx, {
type: 'bar',
data: data,
options: options
});
}
},
mounted() {
this.renderChart(this.data, this.options)
},
watch: {
data: function() {
this.renderChart(this.data, this.options)
}
}
}
【问题讨论】:
-
那么您是想让
updateChart方法工作,还是让data的观察者工作?如果updateChart工作正常,为什么不在updateChart中进行更新后致电renderChart?此外,您可能需要使用{ deep: true }作为data的观察者:vuejs.org/v2/api/#vm-watch
标签: javascript vue.js vuejs2