文章目录
- 监听浏览器窗口resize事件很简单,如下一行代码即可搞定: window.addEventListener(‘resize’, () => {}) 如何监听dom的resize事件呢?
- const myObserver = new ResizeObserve(entries => { console.log(“dom元素resize”) }) myObserver.observe(target)//target:要监听的dom元素 需要注意的一点,在进入和离开当前页面时,dom监听事件都会触发一次。 如果在事件监听函数里面有涉及到对该dom的操作(比如说初始化echart),那么当前页面销毁后,该dom已经不存在了,而监听事件还要执行一次,就会报错(无效的dom): 解决方法:如果是在vue中使用,组件销毁之前停止监听即可: beforeDestroy() { this.myObserver.unobserve(target) }
- 下面给个示例,监听echarts所绑定dom的resize事件,并做防抖处理。 <template> <div ref=”echart” class=”echart”></div> </template> <script> import * as echarts from ‘echarts’ export default { data() { return { myObserver: ”,//resize监听器 timer: ”,//定时器 myEchart: ”,//echart实例 } }, mounted() { //this.loadEchart() //不需要执行上一行的原因是,下面的监听器会在挂载的时候自动执行一次。 this.myObserver = new ResizeObserver(entries => { if(this.timer) { clearTimeout(this.timer) } this.timer = setTimeout(this.loadEchart(), 50) }) this.myObserver.observe(this.$refs.echart) }, beforeDestory() { clearTimeout(this.timer) /* 清除定时器。定时任务不会随着组件销毁而销毁,所以组件销毁后, 如果还有定时任务没有执行,就会继续调用loadEchart函数, 而此时this.$refs.echart是undefined,echart就会报错: “Initialize failed: invalid dom”,意思就是“初始化失败:无效的dom” */ this.myObserver.unobserve(this.$refs.echart) }, methods: { //加载echart loadEchart() { if(this.myEchart) {//如果echart已经初始化过,需要销毁,否则会报错:重复初始化 this.myEchart.dispose() } this.myEchart = echarts.init(this.$refs.echart) let option = { xAxis: { data: [‘1月’, ‘2月’, ‘3月’] }, yAxis: { type: ‘value’ }, series: [ { name: ‘销量’, type: ‘bar’, data: [100, 200, 300] } ] } this.myEchart.setOption(option) } } } </script> <style scoped> .echart { width: 100%; height: 500px; } </style>
目录
- vue使用echarts报错:invalid dom
- 出错原因
- echarts随dom大小自适应变化,并做防抖处理
- 监听窗口resize事件
- 监听dom的resize事件
- 完整代码示例
- 总结
1.使用了了错误的周期函数,应该使用mounted,dom节点没有加载完成
methods:{
showtable(){
console.log("准备输出dom节点")
console.log(document.querySelector('.dashboard-text'))
let myChart = echarts.init(document.querySelector('.dashboard-text'));
// 绘制图表
myChart.setOption({
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
xAxis: {
data: ['衬衫', '羊毛衫', '雪纺衫', '裤子', '高跟鞋', '袜子']
},
yAxis: {},
series: [
{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}
]
})
}
},
mounted(){
console.log("展示图标吧")
this.showtable();
}
2.获取节点元素,不熟悉
- 标签中id= "main",使用document.querySelector("#main")
- 标签中class="main",使用document.querySelector(".main")
监听浏览器窗口resize事件很简单,如下一行代码即可搞定:
window.addEventListener('resize', () => {})
如何监听dom的resize事件呢?
const myObserver = new ResizeObserve(entries => {
console.log("dom元素resize")
})
myObserver.observe(target)//target:要监听的dom元素
需要注意的一点,在进入和离开当前页面时,dom监听事件都会触发一次。
如果在事件监听函数里面有涉及到对该dom的操作(比如说初始化echart),那么当前页面销毁后,该dom已经不存在了,而监听事件还要执行一次,就会报错(无效的dom):

解决方法:如果是在vue中使用,组件销毁之前停止监听即可:
beforeDestroy() {
this.myObserver.unobserve(target)
}
下面给个示例,监听echarts所绑定dom的resize事件,并做防抖处理。
<template>
<div ref="echart" class="echart"></div>
</template>
<script>
import * as echarts from 'echarts'
export default {
data() {
return {
myObserver: '',//resize监听器
timer: '',//定时器
myEchart: '',//echart实例
}
},
mounted() {
//this.loadEchart()
//不需要执行上一行的原因是,下面的监听器会在挂载的时候自动执行一次。
this.myObserver = new ResizeObserver(entries => {
if(this.timer) {
clearTimeout(this.timer)
}
this.timer = setTimeout(this.loadEchart(), 50)
})
this.myObserver.observe(this.$refs.echart)
},
beforeDestory() {
clearTimeout(this.timer)
/*
清除定时器。定时任务不会随着组件销毁而销毁,所以组件销毁后,
如果还有定时任务没有执行,就会继续调用loadEchart函数,
而此时this.$refs.echart是undefined,echart就会报错:
“Initialize failed: invalid dom”,意思就是“初始化失败:无效的dom”
*/
this.myObserver.unobserve(this.$refs.echart)
},
methods: {
//加载echart
loadEchart() {
if(this.myEchart) {//如果echart已经初始化过,需要销毁,否则会报错:重复初始化
this.myEchart.dispose()
}
this.myEchart = echarts.init(this.$refs.echart)
let option = {
xAxis: {
data: ['1月', '2月', '3月']
},
yAxis: {
type: 'value'
},
series: [
{
name: '销量',
type: 'bar',
data: [100, 200, 300]
}
]
}
this.myEchart.setOption(option)
}
}
}
</script>
<style scoped>
.echart {
width: 100%;
height: 500px;
}
</style>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。
您可能感兴趣的文章:
- Vue Echarts报错Initialize failed: invalid dom解决方法
- 在Vue的mounted中仍然加载渲染不出echarts的方法问题
- Vue中使用echarts实现绘制人体动态图
- vue中使用echarts刷新可以正常渲染但路由跳转不显示的问题解决
- vue中echarts@4.9版本,地图的使用方式
- Vue + Echarts页面内存占用高的问题解决方案