2023 Vue直播班筆記 - Teleport自訂元件生成位置

更新 發佈閱讀 10 分鐘
此筆記僅以個人理解的方式記錄

前言

自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。


建置範例

App.vue 根元件組成為, #teleport-content + <router-view>

路徑設定為 "/" 時,App.vue 的 router-view 載入 index.vue ,並根據後續連接的路徑,對應渲染的子路由將組件 pageA.vue & pageB.vue 渲染在 index.vue的<router-view>上

// App.vue
<template>
<div class="my-5" id="teleport-content"></div>
<router-view></router-view>
</template>

<style scoped>
#teleport-content {
min-width: 500px;
height: 300px;
border: 1px solid black;
}
</style>
//index.vue
<template>
<ul class="nav py-5 justify-content-center">
<li class="nav-item me-3">
<router-link class="btn btn-danger" to="/pageA">pageA</router-link>
</li>
<li class="nav-item">
<router-link class="btn btn-primary" to="/pageB">pageB</router-link>
</li>
</ul>
<router-view></router-view>
</template>
raw-image



由此上述設定,我們可以在 "/" 時,利用按紐來改變我們的畫面,以下圖示為各路徑畫面。

raw-image
raw-image


這邊可以看到在 "/pageB" 時有一張貓咪卡片,因為 index.vue 內的 router-view 正渲染著 pageB.vue ,而自訂生成位置又是如何運作的呢?


我們一開始在 App.vue 根元件上有預留個長方形id="teleport-content"的空間,就是要來將​pageB.vue​內的貓咪卡片讓其展示在其中,然而這需求就得利用 teleport 來實現它。當路徑在 /pageB 時,對於 App.vue 來說我們的展示空間跟 pageB.vue 元件,都是處於 App.vue 元件內,因此程式碼會變成

<template>
<div class="my-5" id="teleport-content"></div>
<ul class="nav py-5 justify-content-center"> //App.vue router-view
<li class="nav-item me-3">
<router-link class="btn btn-danger" to="/pageA">pageA</router-link>
</li>
<li class="nav-item">
<router-link class="btn btn-primary" to="/pageB">pageB</router-link>
</li>
</ul>
<h1>Page B 分頁</h1> //index.vue router-view
<div class="card mb-3" style="max-width: 540px;">
<div class="row g-0">
<div class="col-md-4">
<img src="https://storage.googleapis.com/www-cw-com-tw/article/201810/article-5bd182cf13ebb.jpg"
class="h-100 img-fluid rounded-start" alt="...">
</div>
<div class="col-md-8">
<div class="card-body">
<h5 class="card-title">貓咪</h5>
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to
additional content. This content is a little bit longer.</p>
<p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
</div>
</div>
</div>
</div>
</template>

<style scoped>
#teleport-content {
min-width: 500px;
height: 300px;
border: 1px solid black;
}
</style>


但是這時畫面會呈現貓咪卡片還是處於 pageB.vue 之內的情形

raw-image


這時就可以利用 <teleport></teleport> 來實現我們要的功能,只要將想要自訂生成的區塊框起來,並指定生成的位置,就可以達成效果了。

<template>
<div class="my-5" id="teleport-content"></div>
.
.(省略)
.
<h1>Page B 分頁</h1>
<teleport to="#teleport-content"> //teleport開始
<div class="card mb-3" style="max-width: 540px;">
<div class="row g-0">
<div class="col-md-4">
<img src="https://storage.googleapis.com/www-cw-com-tw/article/201810/article-5bd182cf13ebb.jpg"
class="h-100 img-fluid rounded-start" alt="...">
</div>
<div class="col-md-8">
<div class="card-body">
<h5 class="card-title">貓咪</h5>
<p class="card-text">This is a wider card with supporting text below as a natural lead-in to
additional content. This content is a little bit longer.</p>
<p class="card-text"><small class="text-muted">Last updated 3 mins ago</small></p>
</div>
</div>
</div>
</div>
</teleport> //teleport結束
</template>


加上去後就會看到貓咪卡片被加到 #teleport-content 展示空間上了。

raw-image


  • joker
  • 2024/03/15
留言
avatar-img
留言分享你的想法!
avatar-img
Joker Cat
4會員
21內容數
是一隻喜愛前端勇往直前的霹靂酷樂貓
Joker Cat的其他內容
2024/06/04
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
2024/06/04
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
2024/06/03
我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。
Thumbnail
2024/06/03
我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。
Thumbnail
2024/05/30
VUE為單向資料流的框架,在鄰近層級之間我們可以依靠 props 由父層向子層來傳遞需要的資料,然而遇到跨層級的架構時,雖然也是可以一層層傳進去,只是這會造成多餘的處理及凌亂的程式碼,因此才有了 "provide" 來解決我們跨層級的需求。 層級展示圖
Thumbnail
2024/05/30
VUE為單向資料流的框架,在鄰近層級之間我們可以依靠 props 由父層向子層來傳遞需要的資料,然而遇到跨層級的架構時,雖然也是可以一層層傳進去,只是這會造成多餘的處理及凌亂的程式碼,因此才有了 "provide" 來解決我們跨層級的需求。 層級展示圖
Thumbnail
看更多
你可能也想看
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
在程式任何地方都能修改各種react組件狀態的做法分享
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
2023 Vue直播班筆記 - 動態路由Props,接續之前的一般動態路由。分為 "寫死" 及 "彈性" 兩種。
Thumbnail
2023 Vue直播班筆記 - 動態路由Props,接續之前的一般動態路由。分為 "寫死" 及 "彈性" 兩種。
Thumbnail
Vue Router 動態路由,假設有一個賣場,裡面有 100 個商品,我們不可能針對它們創 100 對應的路由,因此我們需要一個動態路由,利用"路徑帶參數"的方式來撈取商品的資訊。
Thumbnail
Vue Router 動態路由,假設有一個賣場,裡面有 100 個商品,我們不可能針對它們創 100 對應的路由,因此我們需要一個動態路由,利用"路徑帶參數"的方式來撈取商品的資訊。
Thumbnail
Vue Router 及 具名視圖,擺脫以往切換依賴 CSS display:none 跟 display:block 互相配合,有時還得搭配 z-index 來調整層級跟 opacity 透明度的麻煩,而 Vue Router 完美的解決了這棘手的問題,且能客製頁面想要呈現的擺飾。
Thumbnail
Vue Router 及 具名視圖,擺脫以往切換依賴 CSS display:none 跟 display:block 互相配合,有時還得搭配 z-index 來調整層級跟 opacity 透明度的麻煩,而 Vue Router 完美的解決了這棘手的問題,且能客製頁面想要呈現的擺飾。
Thumbnail
這系列是我在 2023 六角學院 Vue作品實戰班的筆記,筆記以本人理解的方式記錄。此篇主題為 Slot Props 進階應用 ,其中包含單筆資料、多筆資料。
Thumbnail
這系列是我在 2023 六角學院 Vue作品實戰班的筆記,筆記以本人理解的方式記錄。此篇主題為 Slot Props 進階應用 ,其中包含單筆資料、多筆資料。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News