html - 如何在 Nuxt 中导入和使用自定义 Chart.js 插件? (Chartjs-vuejs v2.9.4)

标签 html css chart.js vue-chartjs

我正在尝试将自定义插件导入到我的图表中。
从我之前的问题中得到这个插件:Question
它是一个插件,因此我可以在我的 Chart.js 版本中使用 Grace。
我使用的Chart.js版本是V2.9.4。 我在 Nuxt! 中使用 vue-chartjs。
在其他任何地方都找不到真正的答案。


This is how it looks now

This is how I want it to look

提前致谢。 :)

  1. 我在我的 Components 文件夹中创建了一个名为“BarChart”的组件。
  2. 我做了一个正常的.vue文件在我的页面目录中。在<template>我添加了我的标签 <Barchart/>组件。
  3. 在同一个.vue文件我在 <script> 中添加了一个脚本标签。
  4. 插件代码包含在下面的代码中,我还没有在任何地方包含它。

  1. Barchart.vue(组件)

    <script>
    import {Bar} from "vue-chartjs";
    
    export default {
      extends: Bar,
      props: {
        data: {
          type: String,
          default: () => {},
        },
        options: {
          type: Object,
          default: () => {},
        },
      },
      computed: {
        Chart() {
          return['data', 'options'];
        },
      },
      mounted() {
        this.renderChart(this.data, this.options);
      },
    };
    </script>

  1. .vue 文件(包含组件)

    <div class="chart">
      <BarChart :data="barChartData" :options="barChartOptions" :height="200"/>
    </div>

  1. .vue 文件(脚本标签)

    <script>
    import BarChart from "~/components/plugins/BarChart";
    
    export default {
      components: {
        BarChart,
      },
      data() {
        return {
          barChartData: {
            labels: ["Verzonden", "Ontvangen", "Geopend", "Kliks"],
            datasets: [
              {
                data: [25, 20, 20, 18],
                backgroundColor: [
                  '#7782FF',
                  '#403DD3',
                  '#FFB930',
                  '#00E437',
                ],
                barThickness : 50,
              },
            ],
          },
          barChartOptions: {
            responsive: true,
            legend: {
              display: false,
            },
            scales: {
              xAxes: [
                {
                  gridLines: {
                    display: false,
                  },
                  ticks: {
                    fontColor: "black",
                    fontSize: 14,
                  },
                },
              ],
              yAxes: [
                {
                  ticks: {
                    beginAtZero: true,
                    min: 0,
                    stepSize: 5,
                    fontColor: '#ABACB3',
                  },
                  gridLines: {
                    display: true,
                    borderDash: [4, 4],
                    color: '#EEEDFB',
                    drawBorder: false,
                  },
                },
              ],
            },
          },
        };
      },
    };
    </script>

  1. 插件代码(我应该把它放在哪里以及如何让它工作?)

    const plugin = {
      id: "customScale",
      beforeLayout: (chart, options, c) => {
        let max = Number.MIN_VALUE;
        let min = Number.MAX_VALUE
        let grace = options.grace || 0
    
        chart.data.datasets.forEach((dataset) => {
          max = Math.max(max, Math.max(...dataset.data));
          min = Math.min(min, Math.min(...dataset.data))
        })
    
        if (typeof grace === 'string' && grace.includes('%')) {
          grace = Number(grace.replace('%', '')) / 100
    
          chart.options.scales.yAxes[0].ticks.suggestedMax = max + (max * grace)
          chart.options.scales.yAxes[0].ticks.suggestedMin = min - (min * grace)
    
        } else if (typeof grace === 'number') {
    
          chart.options.scales.yAxes[0].ticks.suggestedMax = max + grace
          chart.options.scales.yAxes[0].ticks.suggestedMin = min - grace
    
        }
    
      }
    }

最佳答案

根据vue-chartjs documentation您可以通过两种方式做到这一点。

如果您希望该插件可用于所有图表,您可以像这样使用全局注册:

import Chart from 'chart.js'

Chart.pluginService.register({
    id: "customScale",
    beforeLayout: (chart, options, c) => {
      let max = Number.MIN_VALUE;
      let min = Number.MAX_VALUE
      let grace = options.grace || 0

      chart.data.datasets.forEach((dataset) => {
        max = Math.max(max, Math.max(...dataset.data));
        min = Math.min(min, Math.min(...dataset.data))
      })

      if (typeof grace === 'string' && grace.includes('%')) {
        grace = Number(grace.replace('%', '')) / 100

        chart.options.scales.yAxes[0].ticks.suggestedMax = max + (max * grace)
        chart.options.scales.yAxes[0].ticks.suggestedMin = min - (min * grace)

      } else if (typeof grace === 'number') {

        chart.options.scales.yAxes[0].ticks.suggestedMax = max + grace
        chart.options.scales.yAxes[0].ticks.suggestedMin = min - grace

      }

    }
  });

这种导入和注册的方式应该适用于您应用中的任何地方。

第二种方式是内联插件。这需要在您的 BarChart.vue 中完成,如下所示:

mounted() {
  this.addPlugin(
    Chart.pluginService.register({
      id: "customScale",
      beforeLayout: (chart, options, c) => {
        let max = Number.MIN_VALUE;
        let min = Number.MAX_VALUE
        let grace = options.grace || 0

        chart.data.datasets.forEach((dataset) => {
          max = Math.max(max, Math.max(...dataset.data));
          min = Math.min(min, Math.min(...dataset.data))
        })

        if (typeof grace === 'string' && grace.includes('%')) {
          grace = Number(grace.replace('%', '')) / 100

          chart.options.scales.yAxes[0].ticks.suggestedMax = max + (max * grace)
          chart.options.scales.yAxes[0].ticks.suggestedMin = min - (min * grace)

        } else if (typeof grace === 'number') {

          chart.options.scales.yAxes[0].ticks.suggestedMax = max + grace
          chart.options.scales.yAxes[0].ticks.suggestedMin = min - grace

        }

      }
    });
  )
}

关于html - 如何在 Nuxt 中导入和使用自定义 Chart.js 插件? (Chartjs-vuejs v2.9.4),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69658227/

相关文章:

html - CSS3 和 HTML5 ;过渡不起作用

CSS Masking (Webkit) - 一个人如何编码这个圈子?

javascript - 如何动态填充我的 ChartJS 饼图

jquery - Bootstrap-Multiselect:如果使用 overflow-y,下拉菜单位于外部容器下方

javascript - Chart.js 单击事件打开自定义工具提示有时不起作用

javascript - 如何使用 Chart.js 仅更改图表中的特定选项?

javascript - 在加载 div 之前触发事件

html - CSS Form下划线文本域动画效果

html - 100% 高度的垂直滚动条?

javascript - 仅在 <div> 中心显示一个列表项,并溢出 :hidden