大家好,
我想請問要如何解決開啟頁面後,頁面會閃爍一下的問題。
原因是前端的初始值是['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>
正常來說,想要等到資料取得後才渲染的話。
一般來說只能靠 v-show 或是 v-if
來做基本判斷處理。
畢竟VUE在載入完成後,會先建立好基本的畫面出來。
你這裏犯的毛病是,你先給了一個預設值。
所以會導致初始畫面的出現。而又馬上接收到後端傳來的值。
又重新渲染一次。原則上這樣是沒問題的。
所以你要做的行為,是不可能依照你的想法去做。
核心行為的阻止是不可能的事。
你要做的是解決你想要處理的問題(畫面閃)
正常來講,初始畫面突然有出現資料。
這部份是沒大問題。
除了預設空值、設定 v-show 或 v-if之外。
其實也可以設定 loading 的畫面。
簡單來說。就是將初始畫面先放個loading處理。
這樣可以讓使用者覺得,資料還在載入的感覺。
千萬不要再去想說,該如何去延遲渲染。
方向是不對的。