在vue使用echarts報錯:invalid dom問題
vue使用echarts報錯:invalid dom
出錯原因
1.使用了了錯誤的周期函數(shù),應(yīng)該使用mounted,dom節(jié)點沒有加載完成
methods:{
showtable(){
console.log("準(zhǔn)備輸出dom節(jié)點")
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("展示圖標(biāo)吧")
this.showtable();
}2.獲取節(jié)點元素,不熟悉
- 標(biāo)簽中id= "main",使用document.querySelector("#main")
- 標(biāo)簽中class="main",使用document.querySelector(".main")
echarts隨dom大小自適應(yīng)變化,并做防抖處理
監(jiān)聽窗口resize事件
監(jiān)聽瀏覽器窗口resize事件很簡單,如下一行代碼即可搞定:
window.addEventListener('resize', () => {})如何監(jiān)聽dom的resize事件呢?
監(jiān)聽dom的resize事件
const myObserver = new ResizeObserve(entries => {
console.log("dom元素resize")
})
myObserver.observe(target)//target:要監(jiān)聽的dom元素
需要注意的一點,在進入和離開當(dāng)前頁面時,dom監(jiān)聽事件都會觸發(fā)一次。
如果在事件監(jiān)聽函數(shù)里面有涉及到對該dom的操作(比如說初始化echart),那么當(dāng)前頁面銷毀后,該dom已經(jīng)不存在了,而監(jiān)聽事件還要執(zhí)行一次,就會報錯(無效的dom):

解決方法:如果是在vue中使用,組件銷毀之前停止監(jiān)聽即可:
beforeDestroy() {
this.myObserver.unobserve(target)
}
完整代碼示例
下面給個示例,監(jiān)聽echarts所綁定dom的resize事件,并做防抖處理。
<template>
<div ref="echart" class="echart"></div>
</template>
<script>
import * as echarts from 'echarts'
export default {
data() {
return {
myObserver: '',//resize監(jiān)聽器
timer: '',//定時器
myEchart: '',//echart實例
}
},
mounted() {
//this.loadEchart()
//不需要執(zhí)行上一行的原因是,下面的監(jiān)聽器會在掛載的時候自動執(zhí)行一次。
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)
/*
清除定時器。定時任務(wù)不會隨著組件銷毀而銷毀,所以組件銷毀后,
如果還有定時任務(wù)沒有執(zhí)行,就會繼續(xù)調(diào)用loadEchart函數(shù),
而此時this.$refs.echart是undefined,echart就會報錯:
“Initialize failed: invalid dom”,意思就是“初始化失?。簾o效的dom”
*/
this.myObserver.unobserve(this.$refs.echart)
},
methods: {
//加載echart
loadEchart() {
if(this.myEchart) {//如果echart已經(jīng)初始化過,需要銷毀,否則會報錯:重復(fù)初始化
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>
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決vue數(shù)據(jù)更新但table內(nèi)容不更新的問題
這篇文章主要給大家介紹了vue數(shù)據(jù)更新table內(nèi)容不更新解決方法,文中有詳細的代碼示例供大家作為參考,感興趣的同學(xué)可以參考閱讀一下2023-08-08
VueJs里利用CryptoJs實現(xiàn)加密及解密的方法示例
這篇文章主要介紹了VueJs里利用CryptoJs實現(xiàn)加密及解密的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04
Vue 中使用vue2-highcharts實現(xiàn)曲線數(shù)據(jù)展示的方法
下面小編就為大家分享一篇Vue 中使用vue2-highcharts實現(xiàn)曲線數(shù)據(jù)展示的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03
Vue3中數(shù)據(jù)響應(yīng)式原理與高效數(shù)據(jù)操作全解析
這篇文章主要為大家詳細介紹了Vue3中數(shù)據(jù)響應(yīng)式原理與高效數(shù)據(jù)操作的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02

