watchEffect 本身不直接处理大屏自动缩放,真正实现靠 ref 管理的 scaleRatio 响应式缩放比例 + CSS transform: scale;需在 onMounted 中监听 resize 更新 ref,在 watchEffect 中更新容器 transform 样式,并配合防抖、边界限制及图表 resize 手动调用。

watchEffect 本身不直接处理大屏自动缩放,它只负责响应式追踪和触发副作用。真正实现缩放的是配合 ref 管理的屏幕尺寸 + CSS transform: scale 计算逻辑。关键在于:把缩放比例变成响应式依赖,让 watchEffect 能“看到”变化并重新执行样式更新。
把缩放比例变成响应式数据
不能在 watchEffect 里直接读 window.innerWidth,必须先用 ref 包一层,并在 resize 时同步更新:
- 定义 scaleRatio = ref(1),初始值设为 1
- 在 onMounted 中监听 window.resize,调用 updateScale 函数
- updateScale 里计算新比例(例如 window.innerWidth / 1920),并赋值给 scaleRatio.value
- 务必在 onUnmounted 中移除事件监听,避免内存泄漏
用 watchEffect 驱动 DOM 缩放
watchEffect 监听 scaleRatio,一旦变化就更新容器样式:
将静态 Vue 页面(index.vue)改造为动态页面(Custom.vue);稿源仅限 index.vue、其引用的 CSS 与资源路径,禁止参考仓库内其他文件。Invoke when user wants to transform a static Vue page into a dynamic data-driven page with Element UI components.
- 选中需要缩放的最外层容器(如 class="screen-canvas")
- 在 watchEffect 内部获取该 DOM 元素,设置 style.transform = `scale(${scaleRatio.value})`
- 同时设置 style.transformOrigin = 'top left',保证缩放锚点稳定,不偏移
- 可额外加 style.width = '1920px' 和 style.height = '1080px',锁定设计稿原始尺寸
防抖与边界控制要写在 updateScale 里
watchEffect 不负责性能优化,这些逻辑必须前置到 resize 回调中:
立即学习“前端免费学习笔记(深入)”;
- 用 setTimeout 或 lodash debounce 对 resize 做节流(例如 16ms 或 50ms)
- 计算比例后做限制:scaleRatio.value = Math.min(Math.max(ratio, 0.4), 1.8),防止过小看不清或过大溢出
- 如果需宽高分别适配(比如优先保高),就在 updateScale 中按 window.innerHeight / 1080 计算,并区分 translate 调整
配合 ECharts 等图表库要单独处理
watchEffect 触发缩放后,图表不会自动重绘,需手动干预:
- 在 watchEffect 的回调末尾,检查 chart 实例是否存在
- 调用 chart.resize(),确保图表内部坐标系跟随容器缩放更新
- 避免在 watchEffect 里 init 图表——初始化应放在 onMounted 中完成
- 更稳妥的做法是封装一个 useChartResize() 组合式函数,内部监听 scaleRatio 变化

















