vue3+Echarts頁(yè)面加載不渲染顯示空白頁(yè)面的解決
vue3 Echarts頁(yè)面加載不渲染顯示空白頁(yè)面
在父組件獲取到數(shù)據(jù)后傳遞給子組件并沒(méi)有及時(shí)的更新渲染圖表。
在本地開(kāi)發(fā)環(huán)境是沒(méi)有一點(diǎn)問(wèn)題,但發(fā)布到測(cè)試環(huán)境上每次頁(yè)面加載都不渲染,點(diǎn)擊瀏覽器刷新按鈕后才會(huì)去渲染圖表。
個(gè)人認(rèn)為造成這個(gè)問(wèn)題的原因
頁(yè)面加載子組件dom元素此時(shí)還沒(méi)有加載完成,所以看到的就是空白,只有刷新一下才可以。
解決這個(gè)問(wèn)題的方法
在生命周期里面使用 nextTick()待dom加載完成之后再去渲染圖表```
具體實(shí)現(xiàn)代碼:
父組件:
獲取到數(shù)據(jù)后通過(guò)props 傳遞給子組件
```javascript ?<!--入駐統(tǒng)計(jì)折線圖--> ? <hostLine ref="settled" :settledData="settledData"> ? </hostLine> ? // 獲取入駐統(tǒng)計(jì) ? ?async getSettledData() { ? ? ? ? const result = await getProjectSettled(); ? ? ? ? // 如果后臺(tái)返回的數(shù)據(jù)是空 前端就渲染一個(gè)空表出來(lái) 必須等獲取到數(shù)據(jù)以后在渲染 Echarts ? ? ? ? if (result.success) { ? ? ? ? ? if (result.data.companyCount.length === 0 && result.data.stationCount.length === 0) { ? ? ? ? ? ? Object.assign(data.settledData); ? ? ? ? ? } else { ? ? ? ? ? ? Object.assign(data.settledData, result.data); ? ? ? ? ? } ? ? ? ? ? update.value = new Date().getTime(); ? ? ? ? } ? ? ? },
子組件:
接收父組件傳遞的數(shù)據(jù)并進(jìn)行 watch 監(jiān)聽(tīng),在生命周期onMounted里面使用 nextTick進(jìn)行渲染圖表就行了。
<template> <div class="line-overview"> <div class="host-line"> <div class="host-line-title">入駐統(tǒng)計(jì)</div> <div id="hostLine" style="width: 100%; height: 360px"></div> </div> </div> </template> <script lang="ts"> import * as echarts from "echarts/core"; import { TooltipComponent, LegendComponent, GridComponent, } from 'echarts/components'; import { LineChart } from 'echarts/charts'; import { CanvasRenderer } from 'echarts/renderers'; import { UniversalTransition } from 'echarts/features'; import { defineComponent, inject, watch, onMounted, onUnmounted, ref, shallowRef, nextTick } from "vue"; echarts.use([ TooltipComponent, LegendComponent, GridComponent, LineChart, CanvasRenderer, UniversalTransition ]); export default defineComponent({ props: ["settledData"], setup(props) { const update = inject("update"); const LineChart = shallowRef(); const drawChart = () => { const cahrtData = props.settledData; LineChart.value = echarts.init(document.getElementById("hostLine") as HTMLElement); // 指定圖表的配置項(xiàng)和數(shù)據(jù) let option = { tooltip: { trigger: "axis", }, legend: { data: ['企業(yè)數(shù)量', '工位數(shù)量',] }, grid: { left: "3%", right: "4%", bottom: "3%", containLabel: true, }, xAxis: { type: "category", boundaryGap: false, data: cahrtData?.date.reverse() }, // Y標(biāo)尺固定 yAxis: { type: "value", scale: true, // // boundaryGap: [0.2, 0.2], // // 動(dòng)態(tài)設(shè)置Y軸的刻度值 只取整數(shù) min: (value:Record<string,number>) => { return Math.floor(value.min / 100) * 100; }, max: (value:Record<string,number>) => { return Math.ceil(value.max / 100) * 100; }, }, series: [ { name: "企業(yè)數(shù)量", type: "line", stack: "Total", data: cahrtData?.companyCount, }, { name: "工位數(shù)量", type: "line", stack: "Total", data: cahrtData?.stationCount, }, ], }; // 使用剛指定的配置項(xiàng)和數(shù)據(jù)顯示圖表。 LineChart.value.setOption(option); window.addEventListener("resize", () => { LineChart.value.resize(); }); }; onMounted(() => { watch([update], () => { nextTick(()=>{ drawChart(); }) }, { deep: true }) }); onUnmounted(() => { LineChart.value.dispose(); }); }, }); </script>
vue Echarts白屏或等一會(huì)才出現(xiàn)
原因
由于是異步加載數(shù)據(jù),setOption的時(shí)候div的寬高還是0,導(dǎo)致canvas渲染寬高也是0。
解決方法
加上默認(rèn)的width和height
<div class="echarts-vue" style="width:500px; height:500px" ></div>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)掉vue插件Vetur格式化的時(shí)候自動(dòng)添加的樣式操作
這篇文章主要介紹了關(guān)掉vue插件Vetur格式化的時(shí)候自動(dòng)添加的樣式操作,文章圍繞主題展開(kāi)操作過(guò)程,需要的小伙伴可以參考一下,希望對(duì)你有所幫助2022-05-05vue2.0 computed 計(jì)算list循環(huán)后累加值的實(shí)例
下面小編就為大家分享一篇vue2.0 computed 計(jì)算list循環(huán)后累加值的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03淺談mvvm-simple雙向綁定簡(jiǎn)單實(shí)現(xiàn)
本篇文章主要介紹了淺談mvvm-simple雙向綁定簡(jiǎn)單實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04vuex中使用modules時(shí)遇到的坑及問(wèn)題
這篇文章主要介紹了vuex中使用modules時(shí)遇到的坑及問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08基于Vue實(shí)現(xiàn)鼠標(biāo)滾動(dòng)輪控制頁(yè)面橫向滑動(dòng)效果
這篇文章主要介紹了如何基于Vue實(shí)現(xiàn)鼠標(biāo)滾動(dòng)輪控制頁(yè)面橫向滑動(dòng)效果,文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-09-09vue3中利用Export2Excel將數(shù)據(jù)導(dǎo)出為excel表格
這篇文章主要給大家介紹了關(guān)于vue3中利用Export2Excel將數(shù)據(jù)導(dǎo)出為excel表格的相關(guān)資料,最近項(xiàng)目需要前端來(lái)導(dǎo)出Excel操作,所以給大家總結(jié)下,需要的朋友可以參考下2023-09-09Vue實(shí)現(xiàn)PDF文件預(yù)覽的方法詳解
pdf文件預(yù)覽是開(kāi)發(fā)業(yè)務(wù)時(shí)常見(jiàn)的一個(gè)交互,在toB項(xiàng)目中是經(jīng)常用到的,對(duì)于用戶(hù)上傳文件,預(yù)覽文件等操作時(shí)有一個(gè)更好的體驗(yàn),下面我結(jié)合實(shí)際業(yè)務(wù),在vue的基礎(chǔ)上與大家分享這個(gè)實(shí)現(xiàn)方法,需要的朋友可以參考下2023-09-09