Vue使用ApexCharts切换视图报null无属性TypeError错误如何解决?
根因
你遇到的报错是ApexCharts在Vue项目中切换路由/视图时的典型问题,核心原因有3个:
- 生命周期钩子位置错误:你将
atUnmount方法写在了chartOptions配置对象中,这是ApexCharts的配置项专属空间,不会被Vue的生命周期体系识别,你原本想实现的卸载时清空数据逻辑完全没有执行。 - 图表实例未手动销毁:切换视图时组件被Vue卸载,绑定的DOM节点已经被销毁为null,但ApexCharts内部仍在执行更新/清理的逻辑,尝试调用SVG元素的
screenCTM原生API时就触发了null无属性的报错,和你贴的错误栈完全吻合。 - 数据更新逻辑缺失:你仅在
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
相关产品推荐
相关产品推荐

