首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vue-chartjs使我的响应式图表对我的窗口来说太高

Vue-chartjs使我的响应式图表对我的窗口来说太高
EN

Stack Overflow用户
提问于 2019-04-06 09:54:22
回答 3查看 17.9K关注 0票数 11

我用chart.js创建了一个简单的响应式HTML + JS图表,效果很好。我决定在Vue CLI中执行此操作,因此尝试将其切换到vue-chartjs,但相同的图表总是呈现比我的窗口高约33%的高度,并因此呈现垂直滚动条(宽度很好)。我用一个简单的样本图重新创建了这个问题,我用它来渲染:

代码语言:javascript
复制
import {Line} from 'vue-chartjs'
export default {
  extends: Line,
  mounted () {
    this.renderChart(data, options)
  } 
} 

注意,data是微不足道的,而options{}

如果我在Vue组件中使用chart.js,而不是vue-chartjs,那么它工作得很好。也就是说,我只是从我的组件中删除了上面的代码,并将其更改为下面的代码,然后它呈现得很好,就像我的示例HTML + chart.js版本一样。

代码语言:javascript
复制
import Chart from 'chart.js'
function mount(el) {
    return new Chart(
        document.getElementById(el).getContext('2d'), {
        type: 'line',
        data: data,
        options: options,
    })
}

export default {
    template: '<canvas id="chart"></canvas>',
    mounted () {
        self.chart = mount('chart')
    }
}

当然,我使用的是默认的responsive: truemaintainAspectRatio: false,没有明确的CSS或大小设置。

当我使用vue-chartjs时,为什么我不能让图表正确地呈现高度?我使用的是vue-chartjs版本3.4.2,但也尝试了几个版本。我已经看遍了github的bug追踪器,但没有看到任何相关的东西。

EN

回答 3

Stack Overflow用户

发布于 2019-05-23 16:18:23

更新:

您应该将options作为prop传递或本地传递。但需要补充的是:

错误响应: true

  • maintainAspectRatio:

所需的高度以及您所说的选项。下面是我的工作原理:

选项:

代码语言:javascript
复制
options: {
                    scales: {
                        yAxes: [
                            {
                                ticks: {
                                    beginAtZero: true
                                }
                            }]
                    },
                    responsive: true,
                    maintainAspectRatio: false
                }

模板中的

代码语言:javascript
复制
<bin-graph-weight :chart-data="datacollection" :styles="myStyles" :options="datacollection.options"/>

graph-component.js:

代码语言:javascript
复制
import { Line, mixins } from 'vue-chartjs'

const { reactiveProp } = mixins

export default {
    extends: Line,
    mixins: [reactiveProp],
    props: ['options'],
    mounted () {
    // this.chartData is created in the mixin.
        this.renderChart(this.chartData, this.options)
    },
    // If you want to pass options please create a local options object
    watch: {
        chartData () {
            this.$data._chart.update()
        }
    }
}
票数 22
EN

Stack Overflow用户

发布于 2019-11-20 11:45:39

在高度溢出和响应性方面也有问题,通过引入flex父容器来修复,该容器占用了100%的空间。设置响应和比率选项后(查看相关chartjs doc):

代码语言:javascript
复制
options: {
  // ..
  responsive: true,
  maintainAspectRatio: true
}

我使用下面的css填充了父组件的100% (其中TheChart是vue-chartjs组件。基本上需要确保图表的父级总是100%地填充它自己的父级):

vue模板

代码语言:javascript
复制
<v-container class="chart-container">
  <TheChart :chartdata="chartData" :options="chartOptions" />
</v-container>

scss:

代码语言:javascript
复制
.chart-container {
  flex-grow: 1;
  min-height: 0;

  > div {
    position: relative;
    height: 100%;
  }
}
票数 5
EN

Stack Overflow用户

发布于 2019-12-18 00:14:25

有了响应性,图表重新呈现了承诺,并实际设置了两次。使用Vue.js中的观察器,您可以在每次chartData更改时重新呈现。

图表组件:

代码语言:javascript
复制
<script>
import { Bar, mixins } from 'vue-chartjs';

const { reactiveProp } = mixins;

export default {
  extends: Bar,
  mixins: [reactiveProp],
  props: ['chartOptions'],
  mounted() {
    this.renderChart(this.chartData, this.chartOptions);
  },
  watch: {
    chartData() {
      this.renderChart(this.chartData, this.chartOptions);
    },
  },
};
</script>

与动态样式一起使用。

图表属性:

代码语言:javascript
复制
<template>
  <div style="height:300px;">
    <bar-chart :styles="myStyles" :chart-data="dataCollection"
      :chart-options="chartOptions"></bar-chart>
  </div>
</template>

<script>
import BarChart from './ChartBar.vue';

export default {
  components: {
    BarChart,
  },
  props: ['dataCollection'],
  data() {
    return {
      myStyles: {
        height: '300px',
        width: '100%',
        position: 'relative',
      },
      chartOptions: {
        scales: {
          yAxes: [{
            ticks: {
              beginAtZero: true,
            },
            gridLines: {
              display: true,
            },
          }],
          xAxes: [{
            ticks: {
              beginAtZero: true,
            },
            gridLines: {
              display: false,
            },
          }],
        },
        legend: {
          display: true,
        },
        tooltips: {
          enabled: true,
          mode: 'single',
          callbacks: {
            label(tooltipItems, data) {
              const { datasetIndex, index } = tooltipItems;
              const value = data.datasets[datasetIndex].data[index];
              if (parseInt(value, 10) > 999) {
                return ` ${value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')}`;
              }
              return ` ${value}`;
            },
          },
        },
        responsive: true,
        maintainAspectRatio: false,
        height: 300,
      },
    };
  },
};
</script>

<style lang="scss" scoped>

</style>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55545191

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档