一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - Vue 中使用defineAsyncComponent 延遲加載組件

Vue 中使用defineAsyncComponent 延遲加載組件

2021-08-01 23:40前端全棧開發者張張 編程技術

使用 Vue 3 的 defineAsyncComponent 特性可以讓我們延遲加載組件。這意味著它們僅在需要時從服務器加載。

Vue 中使用defineAsyncComponent 延遲加載組件

使用 Vue 3 的 defineAsyncComponent 特性可以讓我們延遲加載組件。這意味著它們僅在需要時從服務器加載。

這是改善初始頁面加載的好方法,因為我們的應用程序將以較小的塊加載,而不必在頁面加載時加載每個組件。

Vue 中使用defineAsyncComponent 延遲加載組件

在本教程中,我們將學習 defineAsyncComponent 的全部內容,并看一個例子,該例子將一個彈出窗口的加載推遲到我們的應用程序需要的時候。

Vue 中使用defineAsyncComponent 延遲加載組件

好了,讓我們開始吧。

什么是defineAsyncComponent

 

  1. // SOURCE: https://v3.vuejs.org/guide/component-dynamic-async.html 
  2. const AsyncComp = defineAsyncComponent( 
  3.   () => 
  4.     new Promise((resolve, reject) => { 
  5.       resolve({ 
  6.         template: '<div>I am async!</div>' 
  7.       }) 
  8.     }) 

defineAsyncComponent 接受一個返回Promise的工廠函數。當我們成功地從服務器獲取組件時,這個Promise應該會被 resolve ,如果出現錯誤則會被 reject 。

要使用它,我們必須從Vue中導入它,然后才能在腳本的其余部分中使用它。

我們也可以使用工廠函數中的 import ,輕松地從其他文件中添加Vue組件。

  1. import { defineAsyncComponent } from "vue"  
  2.  
  3. // 簡單使用 
  4. const LoginPopup = defineAsyncComponent(() => import("./components/LoginPopup.vue")) 

這是使用 defineAsyncComponent 的最簡單方法,但我們也可以傳入一個完整的選項對象,配置幾個更高級的參數。

  1. // with options  
  2. const AsyncPopup = defineAsyncComponent({  
  3.   loader: () => import("./LoginPopup.vue"), 
  4.   loadingComponent: LoadingComponent, /* 在加載時顯示 */ 
  5.   errorComponent: ErrorComponent, /* 顯示是否有錯誤 */ 
  6.   delay: 1000, /* 在顯示加載組件之前延遲毫秒 */ 
  7.   timeout: 3000 /* 這個毫秒之后的超時 */ 
  8. }) 

就我個人而言,我發現自己更經常使用第一種較短的語法,它對我的大多數使用情況都有效,但這完全取決于你。

就這么簡單,讓我們進入我們的例子。

使用defineAsyncComponent延遲加載彈出組件

 

在本例中,我們將使用一個由單擊按鈕觸發的登錄彈出窗口。

每當我們的應用程序加載時,我們不需要我們的應用程序加載此組件,因為只有在用戶執行特定操作時才需要它。

所以這就是我們的登錄組件的樣子,它只是通過用 position: fixed 將屏幕的其余部分涂黑來創建一個彈出窗口,并且有一些輸入和一個提交按鈕。

  1. <template> 
  2.    <div class="popup"
  3.        <div class="content"
  4.            <h4> Login to your account </h4> 
  5.            <input type="text" placeholder="Email" /> 
  6.            <input type="password" placeholder="Password" /> 
  7.            <button> Log in </button> 
  8.        </div> 
  9.    </div> 
  10. </template> 
  11.  
  12. <script> 
  13. </script> 
  14.  
  15. <style scoped> 
  16. .popup { 
  17.     position: fixed; 
  18.     width: 100%; 
  19.     top: ;  
  20.     left: ; 
  21.     height: 100%; 
  22.     background-color: rgba(, , , 0.2); 
  23.     display: flex; 
  24.     justify-content: center; 
  25.     align-items: center; 
  26. .content { 
  27.    min-width: 200px; 
  28.    width: 30%; 
  29.    background: #fff; 
  30.    height: 200px; 
  31.    padding: 10px; 
  32.    border-radius: 5px; 
  33. input[type="text"], input[type="password"] { 
  34.     border: ; 
  35.     outline: ; 
  36.     border-bottom: 1px solid #eee; 
  37.     width: 80%; 
  38.     margin:  auto; 
  39.     font-size: 0.5em; 
  40. button { 
  41.    border: ; 
  42.    margin-top: 50px; 
  43.    background-color:#8e44ad; 
  44.    color: #fff; 
  45.    padding: 5px 10px; 
  46.    font-size: 0.5em; 
  47. </style> 

Vue 中使用defineAsyncComponent 延遲加載組件

而不是像我們通常那樣導入它并將其納入我們的 components 選項中。

  1. <!-- "Standard" way of doing things --> 
  2. <template> 
  3.   <button @click="show = true"> Login </button> 
  4.   <login-popup v-if="show" /> 
  5. </template> 
  6.  
  7. <script> 
  8. import LoginPopup from './components/LoginPopup.vue' 
  9. export default { 
  10.   components: { LoginPopup }, 
  11.   data() { 
  12.     return { 
  13.       show: false 
  14.     } 
  15.   } 
  16. </script> 

我們可以改為使用 defineAsyncComponent 僅在需要時加載它(意味著單擊按鈕并切換我們的 v-if)

  1. <!-- Use defineAsyncComponent  --> 
  2. <template> 
  3.   <button @click="show = true"> Login </button> 
  4.   <login-popup v-if="show" /> 
  5. </template> 
  6.  
  7. <script> 
  8. import { defineAsyncComponent } from 'vue' 
  9. export default { 
  10.   components: {  
  11.     "LoginPopup" : defineAsyncComponent(() => import('./components/LoginPopup.vue')) 
  12.   }, 
  13.   data() { 
  14.     return { 
  15.       show: false 
  16.     } 
  17.   } 
  18. </script> 

雖然這在我們使用我們的應用程序時可能看起來是一樣的,但讓我們檢查元素 > 網絡來理解這個小而重要的區別。

如果我們不使用 defineAsyncComponent,一旦我們的頁面加載,我們就會看到我們的應用程序從服務器上獲得LoginPopup.vue。雖然在這個例子中,這可能不是最大的性能問題,但它仍然會減慢加載速度,如果我們有幾十個組件這樣做,它真的會加起來。

Vue 中使用defineAsyncComponent 延遲加載組件

但是,如果我們使用 defineAsyncComponent 查看同一個選項卡,我們會注意到當我們的頁面加載時,LoginPopup.vue 不見了,這是因為它還沒有加載。

Vue 中使用defineAsyncComponent 延遲加載組件

但是一旦我們點擊我們的按鈕并告訴我們的應用程序顯示我們的彈出窗口,這時它就會從服務器加載,我們可以在網絡標簽中看到它。

Vue 中使用defineAsyncComponent 延遲加載組件

這有助于我們實現最佳性能。我們只想在我們的頁面初始加載時加載需要的組件。有條件渲染的組件在我們的頁面加載時往往是不需要的,所以為什么要讓我們的應用程序加載它們呢?

如何使用異步設置功能

 

無論我們是否使用 defineAsyncComponent 延遲加載,任何具有異步設置功能的組件都必須用 包裝。

簡而言之,創建一個異步設置函數是我們的一個選擇,可以讓我們的組件在渲染前等待一些API調用或其他異步動作。

這是我們具有異步設置的組件。它使用 setTimeout() 模擬 API 調用。

  1. <template> 
  2.    <div class="popup"
  3.        <div class="content"
  4.             <p> Loaded API: {{ article }} </p> 
  5.            <h4> Login to your account </h4> 
  6.            <input type="text" placeholder="Email" /> 
  7.            <input type="password" placeholder="Password" /> 
  8.            <button> Log in </button> 
  9.        </div> 
  10.    </div> 
  11. </template> 
  12.  
  13. <script> 
  14. const getArticleInfo = async () => { 
  15.      // wait 3 seconds to mimic API call 
  16.     await new Promise(resolve => setTimeout(resolve, 1000)); 
  17.     const article = { 
  18.         title: 'My Vue 3 Article'
  19.         author: 'Matt Maribojoc' 
  20.     } 
  21.     return article 
  22. export default { 
  23.     async setup() { 
  24.         const article = await getArticleInfo() 
  25.         console.log(article) 
  26.         return { 
  27.             article 
  28.         } 
  29.     } 
  30. </script> 

我們可以在有或沒有 defineAsyncComponent 的情況下將它導入到我們的組件中

  1. import LoginPopup from './components/LoginPopup.vue' 
  2. // OR  
  3. const LoginPopup = defineAsyncComponent(() => import("./components/LoginPopup.vue")) 

但是如果我們想讓它在我們的模板中渲染,我們需要將它包裝在一個 Suspense 元素中。這將等待我們的 setup 函數在嘗試渲染我們的組件之前解析。

  1. <template> 
  2.   <button @click="show = true"> Login </button> 
  3.   <Suspense v-if="show"
  4.     <template #default
  5.       <login-popup  /> 
  6.     </template> 
  7.     <template #fallback> 
  8.       <p> Loading... </p> 
  9.     </template> 
  10.   </Suspense> 
  11. </template> 

這就是結果。用戶會看到 "正在加載......",然后在3秒后(我們的setTimeout的硬編碼值),我們的組件將渲染。

Vue 中使用defineAsyncComponent 延遲加載組件

默認情況下,我們使用 defineAsyncComponent 定義的所有組件都是可暫停的。

這意味著如果一個組件的父鏈中有 Suspense,它將被視為該 Suspense 的一個異步依賴。我們的組件的加載、錯誤、延遲和超時選項將被忽略,而是由 Suspense 來處理。

最后的想法

 

defineAsyncComponent 在創建有幾十個組件的大型項目時是有好處的。當我們進入到懶惰加載組件時,我們可以有更快的頁面加載時間,改善用戶體驗,并最終提高你的應用程序的保留率和轉換率。

我想知道你對這個功能的看法。如果你已經在你的應用中使用它了,請在下面的評論中告訴我。

原文:https://learnvue.co/2021/06/lazy-load-components-in-vue-with-defineasynccomponent/

作者:Matt Maribojoc

原文鏈接:https://mp.weixin.qq.com/s/V_7CBWC5JulowAN7SF8U_w

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品国产综合久久一线 | 艾秋果冻麻豆老狼 | 国内自拍成人网在线视频 | 别停好爽好深好大好舒服视频 | 国内精品久久久久久野外 | 双子母性本能在线观看 | 国产手机在线αⅴ片无码观看 | 9自拍视频在线观看 | 国产午夜精品久久理论片小说 | 特级淫片大乳女子高清视频 | jiuse视频 | 国产大乳美女挤奶视频 | 成人在线免费看 | 四虎在线精品免费高清在线 | 精精国产xxxx视频在线播放器 | 国产精品一区久久精品 | 2020年新四虎免费 | 亚洲激情自拍偷拍 | 国模娜娜a4u1546全套 | 免费观看国产大片资源视频 | 91理论片午午伦夜理片久久 | 好硬好大好浪夹得好紧h | 精品视频手机在线观看免费 | 国产精品一区二区久久 | 俄罗斯海滩厕所偷窥 | 成人永久免费福利视频网站 | juliaann主妇疯狂| 国产综合第一页 | 草逼的视频| 羞羞麻豆国产精品1区2区3区 | 日本三级香港三级久久99 | 国产成人精品男人的天堂538 | 国产午夜一区二区在线观看 | 插得爽| 免费在线观看小视频 | a∨在线观看 | 精品国产精品国产 | 国产专区日韩精品欧美色 | 亚洲精品久久久打桩机 | 香港论理午夜电影网 | 久久精品国产视频澳门 |