在vue使用echarts报错:invaliddom问题

作者:

文章目录
  • 以上为个人经验,希望能给大家一个参考,也希望大家多多支持风君子博客。 您可能感兴趣的文章: Vue Echarts报错Initialize failed: invalid dom解决方法 在Vue的mounted中仍然加载渲染不出echarts的方法问题 Vue中使用echarts实现绘制人体动态图 vue中使用echarts刷新可以正常渲染但路由跳转不显示的问题解决 vue中echarts@4.9版本,地图的使用方式 Vue + Echarts页面内存占用高的问题解决方案
  • 目录
    • 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页面内存占用高的问题解决方案

      站内搜索