页面中用了splitpanes后,echarts没有随着页面的尺寸进行调整,怎么处理?
这是 Splitpanes 改变的是容器尺寸,不是 window 尺寸 导致的典型问题。
你现在监听的是:
👉 只有浏览器窗口变化才触发 👉 拖动 splitpanes 分栏时 window 尺寸没变 👉 但 图表容器宽高变了 👉 ECharts 不会自动感知 DOM 尺寸变化,所以不重绘
✅ 正确做法:监听“容器尺寸变化”,不是 window
使用 ResizeObserver 监听图表父容器
🔧 Vue3 + ECharts 标准写法
import * as echarts from 'echarts'
import { onMounted, onBeforeUnmount, ref } from 'vue'
const chartRef = ref(null)
const chartInstance = ref(null)
let resizeObserver = null
onMounted(() => {
chartInstance.value = echarts.init(chartRef.value)
chartInstance.value.setOption(option)
// ⭐ 监听容器尺寸变化
resizeObserver = new ResizeObserver(() => {
chartInstance.value?.resize()
})
resizeObserver.observe(chartRef.value)
})
onBeforeUnmount(() => {
resizeObserver?.disconnect()
chartInstance.value?.dispose()
})
📌 模板
⚠️ 高度必须有值(Splitpanes 子 pane 通常需要 height:100%)
🚫 为什么 window.resize 不行?
| 场景 | window.resize | ResizeObserver |
|---|---|---|
| 拖动 splitpanes | ❌ 不触发 | ✅ 触发 |
| 侧边栏折叠展开 | ❌ 不触发 | ✅ 触发 |
| 标签页切换导致尺寸变化 | ❌ | ✅ |
| 浏览器窗口变化 | ✅ | ✅ |
🚀 进阶优化(防抖,防止频繁 resize)
let timer = null
resizeObserver = new ResizeObserver(() => {
clearTimeout(timer)
timer = setTimeout(() => {
chartInstance.value?.resize()
}, 100)
})
🎯 结论
Splitpanes 场景必须用 ResizeObserver 监听 window.resize 是不够的
这是 ECharts 在可拖拽布局里最常见的坑之一。
如果你图表在 el-tabs、dialog、collapse、sidebar 折叠 里尺寸异常,本质也是同一个问题,也可以用这一套方案解决。