Nuxt.js: window 未定义 apexcharts/vue-apexcharts

Nuxt.js: window is not defined apexcharts/vue-apexcharts

我添加了来自 apexcharts.com 的这个简单示例。很确定进口是正确的。我没有在任何地方引用 window。添加此文件时,我的整个应用程序都停止了。我认为这与 SSR 或 Nuxt 配置有关。

<template>
  <div id="chart">
    <apexchart
      type="donut"
      width="380"
      :options="chartOptions"
      :series="series"
    ></apexchart>
  </div>
</template>

<script>
import VueApexCharts from "vue-apexcharts";

export default {
  name: "Donut",
  components: {
    apexchart: VueApexCharts,
  },
  data() {
    return {
      data: {
        series: [44, 55, 41, 17, 15],
        chartOptions: {
          chart: {
            type: "donut",
          },
          responsive: [
            {
              breakpoint: 480,
              options: {
                chart: {
                  width: 200,
                },
                legend: {
                  position: "bottom",
                },
              },
            },
          ],
        },
      },
    };
  },
};
</script>

将您的组件包装在 nuxt 的 <client-only> 组件中。这将防止 SSR/SSG 在尝试引用不存在的 window 对象时中断。

例如

<client-only>
  <chart-component />
</client-only>

中所述(最后一句,使用直接组件语法),以下是如何进行正确的工作设置:

<template>
  <div id="chart">
    <client-only>
      <apexchart
        type="donut"
        width="380"
        :options="chartOptions"
        :series="series"
      ></apexchart>
    </client-only>
  </div>
</template>

<script>
export default {
  name: 'Donut',
  components: {
    [process.browser && 'apexchart']: () => import('vue-apexcharts'),
  },
  data() {
    return {
      series: [44, 55, 41, 17, 15],
      chartOptions: {
        chart: {
          type: 'donut',
        },
        responsive: [
          {
            breakpoint: 480,
            options: {
              chart: {
                width: 200,
              },
              legend: {
                position: 'bottom',
              },
            },
          },
        ],
      },
    }
  },
}
</script>

我还删除了嵌套整个配置的 data,它已经在 data() 中。这导致 non-match 在浏览器控制台错误中显示的道具方面。