数据大屏:VueUse 的组合式 API

大屏适配场景:useWindowSize + useDebounce(核心)

这是最核心的组合,用于大屏自适应容器组件的窗口尺寸监听和防抖处理:

  • **useWindowSize**:替代了原生的window.addEventListener('resize', fn),它能直接返回当前窗口的widthheight响应式数据,不用自己手动维护状态。比如在自适应组件中,我直接通过const { width: windowWidth, height: windowHeight } = useWindowSize()就能获取实时窗口尺寸,省去了手动绑定 / 解绑事件的代码。
  • **useDebounce**:用于包装窗口 resize 的处理逻辑,实现防抖。比如把计算缩放比例的函数传入useDebounce,得到防抖后的函数,避免高频触发计算。

实时数据场景:useIntervalFn + useThrottle

大屏需要实时轮询获取数据(比如设备状态、报警信息),我用到了这两个 API:

  • useIntervalFn:替代了原生的setIntervalclearInterval,它内置了自动清理的逻辑(组件卸载时自动停止定时器),避免内存泄漏。比如轮询获取设备数据时,我用useIntervalFn(() => { getDeviceData() }, 5000),不用在onUnmounted中手动清除定时器。
  • useThrottle:用于处理图表的鼠标 hover 事件(比如地图 hover 显示详情),防止高频触发接口请求,设置节流间隔为 300ms,平衡交互响应和性能。

状态持久化场景:useLocalStorage + useSessionStorage

大屏的全局配置(比如是否开启自适应、图表自动刷新时间)需要持久化,我用到了这两个 API:

  • **useLocalStorage**:把 Pinia 中的全局配置状态和本地存储绑定,比如const autoRefresh = useLocalStorage('screen-auto-refresh', true),这样页面刷新后配置不会丢失,比自己写localStorage.getItem/setItem更简洁,还能自动实现响应式。
  • **useSessionStorage**:用于存储临时的用户操作状态(比如当前选中的区域),仅在当前会话有效,避免污染本地存储。