在vue使用echarts报错:invaliddom问题

目录
  • vue使用echarts报错:invalid dom
    • 出错原因
  • echarts随dom大小自适应变化,并做防抖处理
    • 监听窗口resize事件
    • 监听dom的resize事件
    • 完整代码示例
  • 总结

    vue使用echarts报错:invalid dom

    出错原因

    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")

    echarts随dom大小自适应变化,并做防抖处理

    监听窗口resize事件

    监听浏览器窗口resize事件很简单,如下一行代码即可搞定:

    window.addEventListener('resize', () => {})

    如何监听dom的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页面内存占用高的问题解决方案

    Published by

    风君子

    独自遨游何稽首 揭天掀地慰生平