是否可以根据父组件的 props 在 extends: 属性 中动态添加图表类型?
Is it possible to dynamically add chart type in the extends: property, based on props from parent component?
我有一个导入整个 vue-chartjs 库的 vue chartjs 组件。我的想法是,是否有可能以某种方式传递我想要的图表类型并将其添加到 'extends: VueCharts.charttype?.' 在我提供的示例中它扩展了 VueCharts.Line,我需要这个 属性动态插值,从道具传递。此图表类型是否可能动态地来自父道具以及如何?
<script>
import { VueCharts } from "vue-chartjs";
export default {
extends: VueCharts.Line,
props: ["chartdata", "options"],
mounted() {
this.renderChart(this.chartdata, this.options);
}
}
</script>
<style scoped>
</style>
由于 extends 与 mixin 相同,您需要传递一个动态 mixin,为此您需要两个组件,假设我们有组件 ChartWrapper:
<template>
<div>
<div>{{ chartType }}</div>
<chart :chart-data="datacollection"/>
</div>
</template>
<script>
import Chart from "./Chart";
import { VueCharts, mixins } from "vue-chartjs";
const { reactiveProp } = mixins;
export default {
name: "ChartWrapper",
components: {
Chart
},
props: {
chartType: {
type: String,
required: true
}
},
data() {
return {
datacollection: {
labels: [this.getRandomInt(), this.getRandomInt()],
datasets: [
{
label: "Data One",
backgroundColor: "#f87979",
data: [this.getRandomInt(), this.getRandomInt()]
},
{
label: "Data One",
backgroundColor: "#f87979",
data: [this.getRandomInt(), this.getRandomInt()]
}
]
}
};
},
methods: {
getRandomInt() {
return Math.floor(Math.random() * (50 - 5 + 1)) + 5;
}
},
created() {
if (this.chartType) {
Chart.mixins = [reactiveProp,VueCharts[this.chartType]];
}
}
};
</script>
此组件将 chartType 作为道具,我在脚本顶部将所有图表导入为 VueCharts ==> 1
第二个组成部分:
<script>
export default {
props: ["options"],
mounted() {
// this.chartData is created in the mixin.
// If you want to pass options please create a local options object
this.renderChart(this.chartData, this.options);
}
};
</script>
第二个组件只有 options 道具,并调用了 renderChart 函数。
==> 2
发生了什么事?
ChartWrapper 组件通过 chartType 属性接收图表类型,在 created 钩子中,如果 chartType 存在,则分配图表(由 VueCharts[this.chartType] 解决)除了 reactiveProp 之外,将 Chart 组件作为 mixin,
我还将图表数据传递给图表组件。
最后调用ChartWrapper组件:
<ChartWrapper chartType="Bar"/>
您还可以选择仅扩展折线图的选项,并使用您想要的图表类型更新图表的配置,并为其提供更新以更改类型。
<script>
import { Line, mixins } from 'vue-chartjs';
const { reactiveProp } = mixins;
export default {
extends: Line,
name: "LineChart",
mixins: [reactiveProp],
props: {
options: { type: Object },
chartType: { type: String }
},
mounted () {
this.renderChart(this.chartData, this.options);
},
watch: {
options: {
deep: true,
handler () {
this.$data._chart.options = this.options;
this.updateChart();
}
},
chartType (newVal) {
this.$data._chart.config.type = newVal;
this.updateChart()
}
},
methods: {
updateChart () {
this.$data._chart.update();
},
}
}
</script>
我有一个导入整个 vue-chartjs 库的 vue chartjs 组件。我的想法是,是否有可能以某种方式传递我想要的图表类型并将其添加到 'extends: VueCharts.charttype?.' 在我提供的示例中它扩展了 VueCharts.Line,我需要这个 属性动态插值,从道具传递。此图表类型是否可能动态地来自父道具以及如何?
<script>
import { VueCharts } from "vue-chartjs";
export default {
extends: VueCharts.Line,
props: ["chartdata", "options"],
mounted() {
this.renderChart(this.chartdata, this.options);
}
}
</script>
<style scoped>
</style>
由于 extends 与 mixin 相同,您需要传递一个动态 mixin,为此您需要两个组件,假设我们有组件 ChartWrapper:
<template>
<div>
<div>{{ chartType }}</div>
<chart :chart-data="datacollection"/>
</div>
</template>
<script>
import Chart from "./Chart";
import { VueCharts, mixins } from "vue-chartjs";
const { reactiveProp } = mixins;
export default {
name: "ChartWrapper",
components: {
Chart
},
props: {
chartType: {
type: String,
required: true
}
},
data() {
return {
datacollection: {
labels: [this.getRandomInt(), this.getRandomInt()],
datasets: [
{
label: "Data One",
backgroundColor: "#f87979",
data: [this.getRandomInt(), this.getRandomInt()]
},
{
label: "Data One",
backgroundColor: "#f87979",
data: [this.getRandomInt(), this.getRandomInt()]
}
]
}
};
},
methods: {
getRandomInt() {
return Math.floor(Math.random() * (50 - 5 + 1)) + 5;
}
},
created() {
if (this.chartType) {
Chart.mixins = [reactiveProp,VueCharts[this.chartType]];
}
}
};
</script>
此组件将 chartType 作为道具,我在脚本顶部将所有图表导入为 VueCharts ==> 1
第二个组成部分:
<script>
export default {
props: ["options"],
mounted() {
// this.chartData is created in the mixin.
// If you want to pass options please create a local options object
this.renderChart(this.chartData, this.options);
}
};
</script>
第二个组件只有 options 道具,并调用了 renderChart 函数。 ==> 2
发生了什么事?
ChartWrapper 组件通过 chartType 属性接收图表类型,在 created 钩子中,如果 chartType 存在,则分配图表(由 VueCharts[this.chartType] 解决)除了 reactiveProp 之外,将 Chart 组件作为 mixin, 我还将图表数据传递给图表组件。
最后调用ChartWrapper组件:
<ChartWrapper chartType="Bar"/>
您还可以选择仅扩展折线图的选项,并使用您想要的图表类型更新图表的配置,并为其提供更新以更改类型。
<script>
import { Line, mixins } from 'vue-chartjs';
const { reactiveProp } = mixins;
export default {
extends: Line,
name: "LineChart",
mixins: [reactiveProp],
props: {
options: { type: Object },
chartType: { type: String }
},
mounted () {
this.renderChart(this.chartData, this.options);
},
watch: {
options: {
deep: true,
handler () {
this.$data._chart.options = this.options;
this.updateChart();
}
},
chartType (newVal) {
this.$data._chart.config.type = newVal;
this.updateChart()
}
},
methods: {
updateChart () {
this.$data._chart.update();
},
}
}
</script>