在vue使用echarts報(bào)錯:invalid dom問題
vue使用echarts報(bào)錯:invalid dom
出錯原因
1.使用了了錯誤的周期函數(shù),應(yīng)該使用mounted,dom節(jié)點(diǎn)沒有加載完成
methods:{
showtable(){
console.log("準(zhǔn)備輸出dom節(jié)點(diǎn)")
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é)點(diǎn)元素,不熟悉
- 標(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元素
需要注意的一點(diǎn),在進(jìn)入和離開當(dāng)前頁面時(shí),dom監(jiān)聽事件都會觸發(fā)一次。
如果在事件監(jiān)聽函數(shù)里面有涉及到對該dom的操作(比如說初始化echart),那么當(dāng)前頁面銷毀后,該dom已經(jīng)不存在了,而監(jiān)聽事件還要執(zhí)行一次,就會報(bào)錯(無效的dom):

解決方法:如果是在vue中使用,組件銷毀之前停止監(jiān)聽即可:
beforeDestroy() {
this.myObserver.unobserve(target)
}
完整代碼示例
下面給個(gè)示例,監(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: '',//定時(shí)器
myEchart: '',//echart實(shí)例
}
},
mounted() {
//this.loadEchart()
//不需要執(zhí)行上一行的原因是,下面的監(jiān)聽器會在掛載的時(shí)候自動執(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)
/*
清除定時(shí)器。定時(shí)任務(wù)不會隨著組件銷毀而銷毀,所以組件銷毀后,
如果還有定時(shí)任務(wù)沒有執(zhí)行,就會繼續(xù)調(diào)用loadEchart函數(shù),
而此時(shí)this.$refs.echart是undefined,echart就會報(bào)錯:
“Initialize failed: invalid dom”,意思就是“初始化失?。簾o效的dom”
*/
this.myObserver.unobserve(this.$refs.echart)
},
methods: {
//加載echart
loadEchart() {
if(this.myEchart) {//如果echart已經(jīng)初始化過,需要銷毀,否則會報(bào)錯:重復(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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue3中如何使用ref和reactive定義和修改響應(yīng)式數(shù)據(jù)(最新推薦)
這篇文章主要介紹了vue3中如何使用ref和reactive定義和修改響應(yīng)式數(shù)據(jù),這里就是vue3中setup組合式api中如何定義響應(yīng)式數(shù)據(jù)并且修改賦值全部內(nèi)容,需要的朋友可以參考下2022-12-12
淺談Vuejs中nextTick()異步更新隊(duì)列源碼解析
本篇文章主要介紹了淺談Vuejs中nextTick()異步更新隊(duì)列源碼解析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-12-12
Vue 自定義指令實(shí)現(xiàn)一鍵 Copy功能
指令 (Directives) 是帶有 v- 前綴的特殊特性。這篇文章主要介紹了Vue 自定義指令實(shí)現(xiàn)一鍵 Copy的功能,需要的朋友可以參考下2019-09-09
Vue實(shí)現(xiàn)內(nèi)部組件輪播切換效果的示例代碼
這篇文章主要介紹了Vue實(shí)現(xiàn)內(nèi)部組件輪播切換效果的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
vue中插件和組件的區(qū)別點(diǎn)及用法總結(jié)
在本篇文章里小編給大家分享的是一篇關(guān)于vue中插件和組件的區(qū)別點(diǎn)及用法總結(jié)內(nèi)容,有興趣的的朋友們可以學(xué)習(xí)下。2021-12-12
vue.js使用v-if實(shí)現(xiàn)顯示與隱藏功能示例
這篇文章主要介紹了vue.js使用v-if實(shí)現(xiàn)顯示與隱藏功能,結(jié)合簡單實(shí)例形式分析了使用v-if進(jìn)行判斷實(shí)現(xiàn)元素的顯示與隱藏功能,需要的朋友可以參考下2018-07-07
vue+element實(shí)現(xiàn)下拉菜單并帶本地搜索功能示例詳解
這篇文章主要介紹了vue+element實(shí)現(xiàn)下拉菜單并帶本地搜索功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09

