最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue3頁面數(shù)據(jù)加載延遲的問題分析和解決方法

 更新時間:2024年11月20日 10:12:15   作者:代碼里的小貓咪  
在?Vue?3?的項目中,當我們使用響應式數(shù)據(jù)(如?ref?或?computed)來管理頁面狀態(tài)時,可能會遇到由于接口數(shù)據(jù)加載延遲,導致頁面初始渲染時數(shù)據(jù)尚未獲取完成的問題,本文針對此問題簡單分析了原因和解決方法,需要的朋友可以參考下

1. 問題描述

在 Vue 3 的項目中,當我們使用響應式數(shù)據(jù)(如 ref 或 computed)來管理頁面狀態(tài)時,可能會遇到由于接口數(shù)據(jù)加載延遲,導致頁面初始渲染時數(shù)據(jù)尚未獲取完成的問題。這會導致頁面在數(shù)據(jù)未更新的情況下提前渲染出來,從而產(chǎn)生顯示錯誤或不完整的內(nèi)容。

針對此問題簡單分析下原因和解決方法。

1、Vue 響應式系統(tǒng)的工作機制

Vue 3 的響應式系統(tǒng)基于 Proxy 實現(xiàn),通過 reactive、ref 或 computed 等 API 來響應數(shù)據(jù)的變化。當數(shù)據(jù)變化時,Vue 會自動重新渲染與這些數(shù)據(jù)綁定的 DOM 元素。但是,如果數(shù)據(jù)在初始渲染時為空或未加載,Vue 會將頁面渲染為初始狀態(tài),直到數(shù)據(jù)加載完畢并觸發(fā)響應式更新。

假設存在一個 ref 類型的響應式數(shù)據(jù) data,在組件加載時該數(shù)據(jù)為空,且需要從接口獲取數(shù)據(jù)。

import { defineComponent, ref, onMounted } from 'vue';
 
export default defineComponent(() => {
  const data = ref(''); // 初始值為空
 
  onMounted(async () => {
    // 模擬延遲獲取接口數(shù)據(jù)
    await new Promise((resolve) => setTimeout(resolve, 3000));
    data.value = '已加載的數(shù)據(jù)'; // 設置接口返回的數(shù)據(jù)
  });
 
  return () => (
    <div>
      <p>{data.value ? data.value : '加載中...'}</p>
    </div>
  );
});

效果:組件渲染時,data.value 為 null,所以會展示 加載中...,3秒之后,數(shù)據(jù)才被加載,頁面才會更新。

2、異步加載時的頁面閃爍與內(nèi)容不一致

接口請求需要時間,頁面初始渲染會先使用默認數(shù)據(jù)或空值進行渲染。數(shù)據(jù)加載完成后,頁面可能會發(fā)生更新,導致用戶看到的內(nèi)容短暫不一致或發(fā)生閃爍。

2. 解決方法

1、手動觸發(fā)頁面更新

如果響應式數(shù)據(jù)未觸發(fā)渲染,可以嘗試使用 nextTick 或通過直接重新賦值觸發(fā)更新。

import { defineComponent, ref, nextTick } from 'vue';
export default defineComponent(() => {
  const message = ref<string | null>(null);
  const updateMessage = async () => {
    setTimeout(() => {
      message.value = 'Hello, Vue!';
      nextTick(() => {
        console.log('視圖已更新');
      });
    }, 1000);
  };
  updateMessage();
  return () => (
    <div>
      <p>{message.value || '加載中...'}</p>
    </div>
  );
});

2、使用占位符避免初次渲染閃爍

在初次加載數(shù)據(jù)前,渲染占位符或骨架屏,確保用戶體驗。

import { defineComponent, ref } from 'vue';
export default defineComponent(() => {
  const loading = ref(true);
  const data = ref<string | null>(null);
  setTimeout(() => {
    data.value = '接口數(shù)據(jù)加載完成';
    loading.value = false;
  }, 2000);
  return () => (
    <div>
      {loading.value ? (
        <p>加載中...</p>
      ) : (
        <p>數(shù)據(jù):{data.value}</p>
      )}
    </div>
  );
});

3、異步邏輯補充響應式支持

在異步接口中獲取數(shù)據(jù)后,直接調(diào)用 Vue 提供的響應式 API 來強制觸發(fā)更新。

import { defineComponent, reactive } from 'vue';
export default defineComponent(() => {
  const state = reactive({
    list: [] as string[],
  });
  const fetchList = async () => {
    setTimeout(() => {
      state.list = ['Item 1', 'Item 2', 'Item 3']; // 確保重新賦值觸發(fā)響應式
    }, 1000);
  };
  fetchList();
  return () => (
    <div>
      <ul>
        {state.list.length > 0 ? state.list.map((item) => <li>{item}</li>) : '加載中...'}
      </ul>
    </div>
  );
});

4、使用 watch 監(jiān)聽數(shù)據(jù)變化并在更新時執(zhí)行額外的邏輯。

import { defineComponent, ref, watch } from 'vue';
export default defineComponent(() => {
  const data = ref<string | null>(null);
 
  watch(data, (newVal) => {
    console.log('數(shù)據(jù)已更新:', newVal);
  });
 
  setTimeout(() => {
    data.value = 'Hello, World!';
  }, 1000);
 
  return () => (
    <div>
      <p>{data.value || '加載中...'}</p>
    </div>
  );
});

關鍵點:

1、確保使用響應式對象或變量,并在賦值時考慮 Vue 響應式系統(tǒng)的特點。

2、如果頁面更新異常,可使用 nextTick 或 watch 來確保觸發(fā)渲染。

3、提前處理數(shù)據(jù)加載占位,優(yōu)化用戶體驗。

3. 新的疑惑

可能會出現(xiàn)一個困惑:

為什么使用 ref 的響應式數(shù)據(jù)在頁面渲染后獲取后,不直接更新頁面,而必須放在 watch 里面呢?

ref 的響應式數(shù)據(jù)本身是具有更新頁面的能力的,但如果在頁面渲染后會發(fā)現(xiàn)數(shù)據(jù)更新未觸發(fā)視圖變化,可能是由于以下幾個原因?qū)е碌模?/p>

1、頁面未綁定響應式數(shù)據(jù)

如果在模板或渲染函數(shù)中,數(shù)據(jù)未綁定到 DOM 或組件中,Vue 的響應式系統(tǒng)就不會知道該數(shù)據(jù)的變化需要觸發(fā)視圖更新。

import { defineComponent, ref } from 'vue';
export default defineComponent(() => {
  const data = ref<string | null>(null);
  setTimeout(() => {
    data.value = '新數(shù)據(jù)'; // 更新數(shù)據(jù)
  }, 2000);
  return () => (
    <div>
      {/* 沒有直接使用 data.value */}
      <p>數(shù)據(jù)加載完成!</p>
    </div>
  );
});

示例中,雖然 data.value 被更新了,但它并未綁定到頁面上,因此頁面沒有感知到需要重新渲染。為了解決這個問題,需要確保將數(shù)據(jù)綁定到視圖中:

import { defineComponent, ref } from 'vue';
export default defineComponent(() => {
  const data = ref<string | null>(null);
  setTimeout(() => {
    data.value = '新數(shù)據(jù)'; // 更新數(shù)據(jù)
  }, 2000);
  return () => (
    <div>
      <p>{data.value || '加載中...'}</p>
    </div>
  );
});

2、數(shù)據(jù)賦值操作不當

當從接口獲取數(shù)據(jù)后,不正確的賦值操作,也可以造成響應式數(shù)據(jù)未更新導致的。

3、為什么放到 watch 中能解決?

watch 的作用是監(jiān)聽響應式數(shù)據(jù)的變化并執(zhí)行相應的副作用邏輯。即使數(shù)據(jù)更新沒有直接綁定到視圖,watch 可以保證代碼邏輯在數(shù)據(jù)變化時被觸發(fā)。

import { defineComponent, ref, watch } from 'vue';
export default defineComponent(() => {
  const data = ref<string | null>(null);
  setTimeout(() => {
    data.value = 'Hello, Vue!';
  }, 2000);
  // 監(jiān)聽數(shù)據(jù)變化并更新額外邏輯
  watch(data, (newVal) => {
    console.log('數(shù)據(jù)更新為:', newVal);
  });
  return () => (
    <div>
      <p>{data.value || '加載中...'}</p>
    </div>
  );
});

原因:watch 主動監(jiān)聽數(shù)據(jù)變化,無論視圖是否綁定響應式數(shù)據(jù),watch 都會響應數(shù)據(jù)變化并執(zhí)行邏輯。

以上就是Vue3頁面數(shù)據(jù)加載延遲的問題分析和解決方法的詳細內(nèi)容,更多關于Vue3頁面數(shù)據(jù)加載延遲的資料請關注腳本之家其它相關文章!

相關文章

  • vue監(jiān)聽屏幕尺寸變化問題,window.onresize很簡單

    vue監(jiān)聽屏幕尺寸變化問題,window.onresize很簡單

    這篇文章主要介紹了vue監(jiān)聽屏幕尺寸變化問題,window.onresize很簡單,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 使用Vue實現(xiàn)防篡改的水印

    使用Vue實現(xiàn)防篡改的水印

    我們在平時上網(wǎng)的時候會看到有些圖片是加水印的,一般水印往往是后端來做的,不過有些站點要保護的知識產(chǎn)權(quán)類型比較多,不光是圖片,可能還有視頻或者文字,所以我們水印的作用,就是給他做一個適當?shù)南拗?本文就給大家介紹一下如何使用Vue實現(xiàn)防篡改的水印
    2023-08-08
  • vue實現(xiàn)拖拽窗口功能

    vue實現(xiàn)拖拽窗口功能

    這篇文章主要為大家詳細介紹了vue實現(xiàn)拖拽窗口功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • el-select下拉選擇緩存的實現(xiàn)

    el-select下拉選擇緩存的實現(xiàn)

    本文主要介紹了在使用el-select實現(xiàn)下拉選擇緩存時遇到的問題及解決方案,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-01-01
  • vue如何通過日期篩選數(shù)據(jù)

    vue如何通過日期篩選數(shù)據(jù)

    這篇文章主要介紹了vue如何通過日期篩選數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • vue el-checkbox實現(xiàn)全選單選方式

    vue el-checkbox實現(xiàn)全選單選方式

    這篇文章主要介紹了vue el-checkbox實現(xiàn)全選單選方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue請求數(shù)據(jù)的三種方式

    vue請求數(shù)據(jù)的三種方式

    這篇文章主要介紹了vue請求數(shù)據(jù)的三種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • vue element實現(xiàn)表格合并行數(shù)據(jù)

    vue element實現(xiàn)表格合并行數(shù)據(jù)

    這篇文章主要為大家詳細介紹了vue element實現(xiàn)表格合并行數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 基于Ant-design-vue的Modal彈窗 封裝 命令式與Hooks用法

    基于Ant-design-vue的Modal彈窗 封裝 命令式與Hooks用法

    這篇文章主要給大家介紹了基于Ant-design-vue的Modal彈窗封裝命令式與Hooks用法,文中有詳細的代碼示例,具有一定的參考價值,感興趣的同學可以借鑒閱讀
    2023-06-06
  • vue-cli webpack配置文件分析

    vue-cli webpack配置文件分析

    這篇文章主要介紹了vue-cli webpack配置文件分析,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05

最新評論

承德县| 淳化县| 涿鹿县| 柳州市| 沐川县| 潢川县| 石河子市| 宿州市| 广昌县| 双柏县| 枣强县| 临泽县| 团风县| 烟台市| 彩票| 保定市| 岳普湖县| 名山县| 视频| 泰州市| 始兴县| 和平县| 利川市| 沙湾县| 澳门| 涪陵区| 汉川市| 丰镇市| 普格县| 乡城县| 西盟| 河曲县| 乐亭县| 喀喇沁旗| 宜昌市| 瑞丽市| 汨罗市| 大渡口区| 镇巴县| 哈密市| 镇沅|