在nuxt中使用 Echarts 时,报错:[ECharts] Can't get DOM width or height. Please check dom.clientWidth and dom.clientHeight. They should not be 0.
简单使用
创建composables/useECharts.ts
。此代码中echarts会自动监听窗口大小变化。
import * as echarts from "echarts";
export function useECharts(elementRef: Ref<HTMLElement | null>) {
const chart = ref<echarts.ECharts | null>(null);
// 初始化图表
const initChart = () => {
if (!elementRef.value) return;
chart.value = echarts.init(elementRef.value);
// 窗口大小变化时自动调整
window.addEventListener("resize", resizeChart);
};
// 调整大小
const resizeChart = () => {
chart.value?.resize();
};
// 清理资源
const dispose = () => {
window.removeEventListener("resize", resizeChart);
if (chart.value) {
chart.value.dispose();
chart.value = null;
}
};
watch(elementRef, () => {
if (elementRef.value) {
chart.value = echarts.init(elementRef.value);
}
});
onMounted(() => {
window.addEventListener("resize", resizeChart);
});
onUnmounted(dispose);
return {
chart,
};
}
使用方法:
<template>
<div>
<div ref="chartEl" />
</div>
</template>
<script lang="ts" setup>
const chartEl = ref<HTMLElement | null>(null);
const {chart} = useECharts(chartEl)
const chartData = computed(() => {
return {
// 配置项
};
});
watch(() => [chart.value,chartData.value],() => {
if(!chart.value ||!chartData.value) return;
chart.value.setOption(chartData.value);
})
遇到的问题
图表区域一片空白
图表区域空白,浏览器控制台有警告:[ECharts] Can't get DOM width or height. Please check dom.clientWidth and dom.clientHeight. They should not be 0.
echarts 需要目标元素的宽度和高度不能为 0。宽度一般不用设置,高度由于没有内容是0,所有需要设置一个高度。固定高度或者flex布局皆可。
但是我设置了高度还是有这个问题,尝试了Vue的nextTick,没有效果。最终方案是使用nuxt的client-only
组件包裹echarts元素。我推测这是nuxt导致的。
<client-only>
<div ref="chartEl"></div>
</client-only>
在v-for里使用
在v-for
里使用上面的代码,会导致chartEl.value
是一个数组,而不是一个元素。所以建议把图表元素放到v-for
外面。