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

页面导航时Chart.js报Cannot read properties of undefined (reading 'notifyPlugins')错误

解决Svelte + Chart.js导航离开时的notifyPlugins未定义错误

在使用Svelte结合Chart.js开发图表组件时,页面加载显示正常,但导航离开页面时控制台抛出Cannot read properties of undefined (reading 'notifyPlugins')错误,该错误触发于Chart.js的destroy方法调用this.notifyPlugins('beforeDestroy')时,可通过以下几种方式解决:

  • 正确管理Chart实例的生命周期
    在Svelte组件中,将Chart实例存储在组件状态变量中,而非局部变量,并在onDestroy钩子中手动销毁实例,确保销毁逻辑的顺序和有效性:

    <script>
      import { onMount, onDestroy } from 'svelte';
      import Chart from 'chart.js/auto';
    
      let canvasElement;
      let chartInstance;
    
      onMount(() => {
        chartInstance = new Chart(canvasElement, {
          type: 'bar',
          data: {/* 数据配置 */},
          options: {/* 图表选项 */}
        });
      });
    
      onDestroy(() => {
        // 确保实例存在且销毁方法可用时再执行销毁
        if (chartInstance && typeof chartInstance.destroy === 'function') {
          chartInstance.destroy();
          chartInstance = null; // 销毁后清空引用,避免后续无效调用
        }
      });
    </script>
    
    <canvas bind:this={canvasElement}></canvas>
    
  • 检查自定义插件的上下文绑定
    若项目使用了自定义Chart.js插件(如plugins.ts),需确保插件钩子函数使用普通函数而非箭头函数,避免丢失Chart实例的this上下文:

    // 错误示例:箭头函数会导致this指向全局对象而非Chart实例
    const badPlugin = {
      beforeDestroy: () => {
        // 此处this无法访问Chart实例的notifyPlugins等方法
      }
    };
    
    // 正确示例:使用普通函数保留Chart实例上下文
    const goodPlugin = {
      beforeDestroy: function() {
        // this指向当前Chart实例,可安全调用实例方法
        this.notifyPlugins('beforeDestroy');
      }
    };
    
  • 修复Svelte动作的销毁逻辑
    若通过Svelte动作(如add-chart.ts)初始化Chart,需确保动作的销毁回调正确处理实例,避免重复销毁或引用丢失:

    import Chart from 'chart.js/auto';
    
    export function addChart(node, chartConfig) {
      const chart = new Chart(node, chartConfig);
    
      return {
        destroy() {
          if (chart) {
            chart.destroy();
          }
        }
      };
    }
    

    同时避免在组件中多次绑定该动作到同一个DOM元素,防止生成多个冲突的Chart实例。

  • 避免实例引用被意外清空
    排查组件内是否有异步逻辑或其他操作在onDestroy前就将Chart实例引用设为null,导致DOM销毁时Chart内部销毁逻辑执行时实例已失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 23:12:24