在vue使用echarts报错:invalid dom问题
作者:顽强的小豆子
这篇文章主要介绍了在vue使用echarts报错:invalid dom问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
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>
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。