resize.js

代码

javascript 复制代码
import { debounce } from "lodash";
export default {
  data() {
    return {
      handleResize: debounce(this.resizeChart, 100),
    };
  },
  mounted() {
    window.addEventListener("resize", this.handleResize);
  },
  beforeDestroy() {
    window.removeEventListener("resize", this.handleResize);
    this.disposeChart();
  },
  updated() {
    this.handleResize();
  },
  methods: {
    resizeChart() {
      this.chart?.resize();
    },
    disposeChart() {
      // dispose() 方法是图表库提供的一个方法,用于销毁图表实例,释放其占用的资源。
      this.chart?.dispose();
    },
  },
};

这段代码是 Vue 组件中一个非常典型的处理图表自适应窗口大小变化的逻辑,核心目的是让图表在浏览器窗口尺寸改变或组件更新时,能够平滑地调整自身大小,同时做好资源清理避免内存泄漏。

代码整体功能拆解

  1. 核心依赖与数据定义
javascript 复制代码
javascript
运行
import { debounce } from "lodash"; // 引入lodash的防抖函数
export default {
  data() {
    return {
      // 把resizeChart方法包装成防抖函数,延迟100ms执行
      handleResize: debounce(this.resizeChart, 100),
    };
  },

debounce(防抖):窗口 resize 事件会高频触发(比如拖动窗口边框时每秒触发几十次),防抖能让 resizeChart 只在最后一次触发后等待 100ms 执行,避免频繁调用图表 resize 导致性能卡顿。

这里把防抖后的函数 handleResize 存在 data 里,是为了保证添加 / 移除事件监听时用的是同一个函数引用(否则 removeEventListener 会失效)。

  1. 生命周期钩子:事件监听与清理
javascript 复制代码
javascript
运行
mounted() {
  // 组件挂载后,给window添加resize事件监听,触发时执行防抖后的resize逻辑
  window.addEventListener("resize", this.handleResize);
},
beforeDestroy() {
  // 组件销毁前,移除resize事件监听(避免内存泄漏)
  window.removeEventListener("resize", this.handleResize);
  // 销毁图表实例,释放图表占用的DOM/内存资源
  this.disposeChart();
},

mounted:组件渲染完成后,监听浏览器窗口大小变化。

beforeDestroy:组件销毁时必须移除事件监听(否则即使组件没了,事件还在,会导致内存泄漏),同时销毁图表实例释放资源。

  1. 组件更新与方法定义
javascript 复制代码
javascript
运行
updated() {
  // 组件数据更新导致DOM变化后,主动触发图表resize
  this.handleResize();
},
methods: {
  resizeChart() {
    // 安全调用图表的resize方法(?.是可选链,避免chart未定义时报错)
    this.chart?.resize();
  },
  disposeChart() {
    // 销毁图表实例,释放资源
    this.chart?.dispose();
  },
},

updated:Vue 组件的 DOM 更新完成后触发,比如图表容器大小因数据变化改变时,主动调整图表尺寸。

resizeChart:核心方法,调用图表库(如 ECharts、Highcharts)的resize方法让图表适配容器大小。

disposeChart:销毁图表实例,彻底释放图表占用的内存和 DOM 绑定。

总结

这段代码的核心作用和关键点:

自适应调整:监听浏览器窗口 resize 事件,结合防抖优化性能,让图表自动适配窗口大小。

主动更新:组件 DOM 更新后主动触发图表 resize,保证数据变化时图表尺寸正确。

资源清理:组件销毁时移除事件监听、销毁图表实例,避免内存泄漏(这是前端图表开发的关键最佳实践)。

简单来说,这是 Vue 中处理图表自适应的 "标准写法",既保证了交互体验(不卡顿),又避免了内存泄漏问题。

相关推荐
Larcher4 小时前
React Router 不只是页面跳转:从 SPA 路由到权限守卫的完整实践
javascript·后端
Larcher4 小时前
大模型为什么每次回答都不一样?一文搞懂 Temperature、Top K 与 Top P
javascript·后端
用户938515635077 小时前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战
前端·设计模式·typescript
CodeSheep7 小时前
稚晖君公司人事大变动,来了!
前端·后端·程序员
鱼樱前端8 小时前
用 AI 做内容变收入
前端·人工智能·ai编程
eric-sjq8 小时前
10 分钟实战:用 0.6B 本地模型生成中文网页(WanlyFrontend + 编译器全流程)
javascript·机器学习·自然语言处理·html
浮生望8 小时前
React + TypeScript 组件设计进阶:从类型约束到无状态组件的三次进化
前端
To_OC8 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
90后的晨仔8 小时前
Mac 开发 uni-app 终极方案:让安卓模拟器彻底脱离 Android Studio 独立运行
前端·vue.js
90后的晨仔8 小时前
别再搞混了!uni-app 中 node_modules 和 uni_modules 到底是什么关系?
前端