【问题标题】:Chart.js chart in vue.js component does not updatevue.js 组件中的 Chart.js 图表不更新
【发布时间】:2018-01-08 06:02:10
【问题描述】:

我正在使用 vue.js 和 chart.js 为一些加密投资组合开发一个可视化模块,但目前我遇到了这个问题:

显示空图表,但未呈现任何值。

由于这些值是在图表初始化后动态加载的,我相信图表没有正确更新自身(即使我调用了 .update()),但没有显示任何错误。

我将 chart.js 渲染包装在一个 vue 组件中:

Vue.component('portfolioValues', {
    template: '<canvas width="400" height="200"></canvas>',
    data: function() {
        return {
            portfolio_value: [],
            portfolio_labels: [],
            chart: null,
        }
    },
    methods: {
        load_portfolio_value_local: function() {
            values = [];
            labels = []
            local_data.forEach(element => {
                values.push(element.total_usd);
                labels.push(moment(element.timestamp, 'X'));
            });
            this.portfolio_value = values;
            this.portfolio_labels = labels;
            this.chart.update();
        },

        render_chart: function() {
            this.chart = new Chart(this.$el, {
                type: 'line',
                data: {
                    labels: this.portfolio_labels,
                    datasets: [{
                        label: "Portfolio Value",
                        data: this.portfolio_value,
                    }]
                },
                options: {
                    scales: {
                        xAxes: [{
                            type: 'time',
                            distribution: 'linear',
                        }]
                    }
                }
            });
        }
    },
    mounted: function() {
        this.render_chart();
        this.load_portfolio_value_local();
    }
});

出于演示目的,我只是在本地添加了一些数据,如下所示:

local_data = [{
        "timestamp": 1515102737,
        "total_btc": 0.102627448096786,
        "total_usd": 1539.41274772627
    }, {
        "timestamp": 1515102871,
        "total_btc": 0.102636926127186,
        "total_usd": 1538.52649627725
    }, {
        "timestamp": 1515103588,
        "total_btc": 0.102627448096786,
        "total_usd": 1532.33042753311
    }
]

这里是完整的演示代码:https://codepen.io/perelin/pen/mppbxV

任何想法为什么没有数据被渲染?谢谢!

【问题讨论】:

    标签: javascript vue.js chart.js


    【解决方案1】:

    这里的问题是 vuejs 如何处理它的data。

    如果你这样使用它:

    local_data.forEach(element => {
        this.portfolio_value.push(element.total_usd);
        this.portfolio_labels.push(moment(element.timestamp, 'X'));
    });
    
    this.chart.update();
    

    图表将更新。但是通过重新初始化数组,您可以使用 vuejs。

    TL;DR

    如果要重新初始化对象,可以将数组分配给对象:

    Object.assign(this.portfolio_value, values);
    Object.assign(this.portfolio_labels, labels);
    

    这样,链接仍然有效。

    【讨论】:

      猜你喜欢
      • 2018-04-27
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 2019-10-10
      • 2018-08-16
      相关资源
      最近更新 更多