我用chart.js创建了一个简单的响应式HTML + JS图表,效果很好。我决定在Vue CLI中执行此操作,因此尝试将其切换到vue-chartjs,但相同的图表总是呈现比我的窗口高约33%的高度,并因此呈现垂直滚动条(宽度很好)。我用一个简单的样本图重新创建了这个问题,我用它来渲染:
import {Line} from 'vue-chartjs'
export default {
extends: Line,
mounted () {
this.renderChart(data, options)
}
} 注意,data是微不足道的,而options是{}。
如果我在Vue组件中使用chart.js,而不是vue-chartjs,那么它工作得很好。也就是说,我只是从我的组件中删除了上面的代码,并将其更改为下面的代码,然后它呈现得很好,就像我的示例HTML + chart.js版本一样。
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: true和maintainAspectRatio: false,没有明确的CSS或大小设置。
当我使用vue-chartjs时,为什么我不能让图表正确地呈现高度?我使用的是vue-chartjs版本3.4.2,但也尝试了几个版本。我已经看遍了github的bug追踪器,但没有看到任何相关的东西。
发布于 2019-05-23 16:18:23
更新:
您应该将options作为prop传递或本地传递。但需要补充的是:
错误响应: true
所需的高度以及您所说的选项。下面是我的工作原理:
选项:
options: {
scales: {
yAxes: [
{
ticks: {
beginAtZero: true
}
}]
},
responsive: true,
maintainAspectRatio: false
}模板中的:
<bin-graph-weight :chart-data="datacollection" :styles="myStyles" :options="datacollection.options"/>graph-component.js:
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()
}
}
}发布于 2019-11-20 11:45:39
在高度溢出和响应性方面也有问题,通过引入flex父容器来修复,该容器占用了100%的空间。设置响应和比率选项后(查看相关chartjs doc):
options: {
// ..
responsive: true,
maintainAspectRatio: true
}我使用下面的css填充了父组件的100% (其中TheChart是vue-chartjs组件。基本上需要确保图表的父级总是100%地填充它自己的父级):
vue模板
<v-container class="chart-container">
<TheChart :chartdata="chartData" :options="chartOptions" />
</v-container>scss:
.chart-container {
flex-grow: 1;
min-height: 0;
> div {
position: relative;
height: 100%;
}
}发布于 2019-12-18 00:14:25
有了响应性,图表重新呈现了承诺,并实际设置了两次。使用Vue.js中的观察器,您可以在每次chartData更改时重新呈现。
图表组件:
<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>与动态样式一起使用。
图表属性:
<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>https://stackoverflow.com/questions/55545191
复制相似问题