iT邦幫忙

0

vue3 要如何延遲渲染DOM

  • 分享至 

  • xImage

大家好,
我想請問要如何解決開啟頁面後,頁面會閃爍一下的問題。

原因是前端的初始值是['1'],渲染頁面。
但從後端接收到的值是['1','2',.......,'100']的陣列時。
dataArray的值改變,頁面會重新選染。

造成進入頁面後,在短短一秒內,畫面會渲染兩次。
肉眼可看到,頁面會閃爍一下。

有辦法讓vue等到接收到後端的值後,才開始選染畫面嗎?
以下的環境是 vite、vue3 。

<script setup>
    import axios from 'axios';
    import { ref } from 'vue'
    const dataArray = ref(['1'])
    ; (function () {
        axios.get('http://localhost/nexttick.php')
            .then((res) => {
                dataArray.value = res.data
            })
            .catch(() => {})
    })()
</script>
<template>
    <section>
        <div v-for="(data, index) in dataArray" :key="'data' + index">
            {{ data }}
        </div>
    </section>
</template>
lolis iT邦新手 5 級 ‧ 2022-08-03 11:26:40 檢舉
那這樣的話 一開始設置
const dataArray = ref([])
v-if 判斷 dataArray 陣列為空 則不渲染
等到後端數據傳入 更改 dataArray 即可

亦可增加 v-cloak 優化
https://vuejs.org/api/built-in-directives.html#v-cloak
froce iT邦大師 1 級 ‧ 2022-08-03 11:28:05 檢舉
dataArray 初始值直接給空陣列就好。
const dataArray = ref([])
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

0
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2022-08-03 12:55:17
最佳解答

正常來說,想要等到資料取得後才渲染的話。
一般來說只能靠 v-show 或是 v-if
來做基本判斷處理。

畢竟VUE在載入完成後,會先建立好基本的畫面出來。

你這裏犯的毛病是,你先給了一個預設值。
所以會導致初始畫面的出現。而又馬上接收到後端傳來的值。
又重新渲染一次。原則上這樣是沒問題的。

所以你要做的行為,是不可能依照你的想法去做。
核心行為的阻止是不可能的事。
你要做的是解決你想要處理的問題(畫面閃)

正常來講,初始畫面突然有出現資料。
這部份是沒大問題。

除了預設空值、設定 v-show 或 v-if之外。
其實也可以設定 loading 的畫面。

簡單來說。就是將初始畫面先放個loading處理。
這樣可以讓使用者覺得,資料還在載入的感覺。

千萬不要再去想說,該如何去延遲渲染。
方向是不對的。

我要發表回答

立即登入回答