vue3中Teleport和Suspense的具體使用
一、Teleport
Vue.js 3.0 的新功能之一是 Teleport。因為有時,你可能需要將組件的一部分渲染到 DOM 樹中的一個不同位置,而不是作為組件的直接子節(jié)點渲染。這就是Teleport的用途。
例如,模態(tài)對話框、提示、通知等都可能使用 Teleport。通常情況下,你可能想要將這些內容添加到應用的根或者 body 標簽下,而不是嵌套在深層的 UI 結構里。Vue 3 中的 Teleport 提供了這樣的機會,就是不管你的組件在哪里,你都可以將其子組件轉移到DOM的任何位置。
在模板中,Teleport 的使用方法如下:
<teleport to="body"> <div class="modal"> <!-- 具體內容 --> </div> </teleport>
'body' 是要傳送組件的目標元素的選擇器。你可以用任何有效的 CSS 選擇器替換它。
以上面的模態(tài)框為例,一般的寫法可能是:
<div class="parent"> <div class="child"> <div class="modal" v-if="showModal"> I am a modal! </div> </div> </div>
但如果使用teleport,就可以將modal獨立出來:
<div class="parent"> <div class="child"> <teleport to="body"> <div class="modal" v-if="showModal"> I am a modal! </div> </teleport> </div> </div>
這樣,無論在DOM樹的何處調用模態(tài)框,模態(tài)框始終會被渲染到 body 元素下,這可以避免由于 CSS層疊上下文和 z-index 問題造成的樣式問題。
二、Suspense
<Suspense> 是 Vue 3 中的一個新特性,它能夠處理組件中的異步依賴并在等待過程中提供備用內容。
當我們使用異步組件時,組件需要一些時間來加載。在加載完成之前,我們通常會向用戶展示一些加載狀態(tài)。以前,我們需要在組件內部自己處理這個邏輯。但是現(xiàn)在,有了<Suspense>,我們可以將這個邏輯提升到組件外部。
Suspense 組件有兩個插槽: default 插槽和 fallback 插槽。default 插槽用于放置那些可能含有異步依賴的組件,而 fallback 插槽則用于展示加載狀態(tài)。
下面是一個使用示例:
<template> ? <Suspense> ? ? <template v-slot:default> ? ? ? <Child /> ? ? </template> ? ? <template v-slot:fallback> ? ? ? <div>Loading...</div> ? ? </template> ? </Suspense> </template> <script> // import Child from './components/Child'//靜態(tài)引入 ?? ?import {defineAsyncComponent} from 'vue'? ?? ?const Child = defineAsyncComponent(()=>import('./components/Child')) //異步引入 ?? ?export default { ?? ??? ?name:'App', ?? ??? ?components:{Child}, ?? ?} </script>
在以上代碼中,Child 是一個異步組件。當這個組件正在加載時,Suspense 會自動切換到fallback插槽,并顯示 “Loading…”。當組件加載完成后,Suspense 則會切換回default插槽,顯示加載完成的組件。
Suspense 能讓我們更方便地控制異步組件的加載狀態(tài),讓代碼看起來更加清晰,使我們能夠將更多的精力集中在處理業(yè)務邏輯上。
三、nextTick
$nextTick 是 Vue.js 提供的一個全局API,它用于延遲執(zhí)行一段代碼,延遲到下一次 DOM 更新循環(huán)之后。這在修改數(shù)據(jù)之后立即操作 DOM 結構時非常有用。
使用 $nextTick 的基本方式如下:
this.someData = 'new value' this.$nextTick(function () { // DOM 更新后的代碼 })
例如,想象一下我們有一個 Vue.js 組件,它有一個列表。點擊一個按鈕將在列表中添加一個新的 item,然后我們想要滾動到這個新創(chuàng)建的 item。如果我們不使用 $nextTick,DOM可能會在我們嘗試訪問新元素之前還沒有被更新。
舉例來說:
new Vue({ ? // ... ? data: { ? ? items: ['item 1', 'item 2', 'item 3'], ? }, ? methods: { ? ? addItem() { ? ? ? this.items.push(`item ${this.items.length + 1}`); ? ? ? this.$nextTick(() => { ? ? ? ? const list = this.$el.querySelector('ul'); ? ? ? ? list.scrollTop = list.scrollHeight; ? ? ? }); ? ? }, ? }, ? // ... })
在這個例子中,我們首先更新了 items 數(shù)據(jù),然后使用 $nextTick 等待 Vue.js 更新 DOM。當回調函數(shù)被調用時,我們知道新的 item 已經(jīng)被添加到了 DOM,然后我們滾動列表確保新 item 可以被用戶看到。如果我們沒有使用 $nextTick,list.scrollHeight 可能不會包含新 item,所以滾動操作可能不會如我們預期的那樣工作。
到此這篇關于vue3中Teleport和Suspense的具體使用的文章就介紹到這了,更多相關vue3 Teleport Suspense內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
element表格翻頁第2頁從1開始編號(后端從0開始分頁)
這篇文章主要介紹了element表格翻頁第2頁從1開始編號(后端從0開始分頁),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12Vuex數(shù)據(jù)持久化的兩種方式:手動存儲和vuex-persistedstate插件詳解
這篇文章主要介紹了Vuex數(shù)據(jù)持久化的兩種方式:手動存儲和vuex-persistedstate插件,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08Vue中的el-date-picker時間選擇器的使用實例詳解
el-date-picker是Element UI框架中提供的日期選擇器組件,它支持單個日期、日期范圍、時間、日期時間等多種選擇方式,本文給大家介紹Vue中的el-date-picker時間選擇器的使用,感興趣的朋友一起看看吧2023-10-10vue本地構建熱更新卡頓的問題“75?advanced?module?optimization”完美解決方案
這篇文章主要介紹了vue本地構建熱更新卡頓的問題“75?advanced?module?optimization”解決方案,每次熱更新都會卡在?"75?advanced?module?optimization"?的地方不動了,如何解決這個問題呢,下面小編給大家?guī)砹私鉀Q方案,需要的朋友可以參考下2022-08-08