You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue使用ApexCharts切换视图报null无属性TypeError错误如何解决?

根因

你遇到的报错是ApexCharts在Vue项目中切换路由/视图时的典型问题,核心原因有3个:

  1. 生命周期钩子位置错误:你将atUnmount方法写在了chartOptions配置对象中,这是ApexCharts的配置项专属空间,不会被Vue的生命周期体系识别,你原本想实现的卸载时清空数据逻辑完全没有执行。
  2. 图表实例未手动销毁:切换视图时组件被Vue卸载,绑定的DOM节点已经被销毁为null,但ApexCharts内部仍在执行更新/清理的逻辑,尝试调用SVG元素的screenCTM原生API时就触发了null无属性的报错,和你贴的错误栈完全吻合。
  3. 数据更新逻辑缺失:你仅在created钩子中赋值props对应的图表数据,若父组件传递的props是异步返回的(比如接口拉取数据源后再传值),首次渲染时图表只会拿到空数组,后续props变化也不会触发图表重绘,也可能引发渲染异常。
    刷新页面后问题消失是因为刷新后所有资源重新加载,图表是首次初始化,没有组件卸载再重建的流程,不会触发销毁阶段的异常逻辑。
修复方案

直接替换你的组件代码即可,修改点如下:

  • 删除chartOptions中错误放置的atUnmount方法,改用Vue标准的beforeUnmount生命周期钩子
  • 给图表组件加ref,卸载前先主动调用ApexCharts实例的destroy方法,避免内部逻辑操作已销毁的DOM
  • 增加props监听器,props变化时自动更新图表数据,兼容异步传参场景
  • 全量更新chartOptions保证Vue响应式生效

修复后的完整代码:

<template>
  <div>
     <apexchart
      ref="chartRef"
      width="500"
      type="line"
      :options="chartOptions"
      :series="series"
    ></apexchart>
  </div>
</template>

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

export default {
  name:'Graf',
  components: {
    apexchart: VueApexCharts, 
  },
  data() {
    return {
      chartOptions: {
        chart: {
          id: "graf",
        },
        xaxis: {
          categories: [],
        }
      },
      series: [
        {
          name: "series",
          data: [],
        },
      ] 
    };
  },
  props:{ 
    data: {
      type: Array,
      default: () => []
    },
    timestamp: {
      type: Array,
      default: () => []
    }
  },
  watch: {
    // 监听数据prop变化,自动更新序列
    data: {
      handler(newVal) {
        this.series = [{ data: newVal }]
      },
      immediate: true
    },
    // 监听时间戳prop变化,自动更新x轴
    timestamp: {
      handler(newVal) {
        // 全量替换配置保证响应式生效
        this.chartOptions = Object.assign({}, this.chartOptions, {
          xaxis: {
            categories: newVal
          }
        })
      },
      immediate: true
    }
  },
  beforeUnmount() {
    // 卸载前先销毁图表实例
    if (this.$refs.chartRef) {
      this.$refs.chartRef.destroy()
    }
    // 清空残留数据
    this.chartOptions.xaxis.categories = []
    this.series = []
  }
}
</script>

如果你的页面使用了<keep-alive>缓存,还需要额外在deactivated钩子中执行和beforeUnmount相同的销毁逻辑,在activated钩子中重新初始化图表数据即可。

内容的提问来源于stack exchange,提问作者PeopleCallMeLucifer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:48:05