[Vue] 進階API-Teleport
TL;DR
可以使用Refs快速取出需要的DOM元素
參考資料
相關連結
- Teleport 文檔 | Official guide
<Teleport>
| Official API
基本語法
在使用teleport時,一定要使用teleport
標籤:
並且搭配to="{target}"
去指定要傳送的位址:<teleport to="{target}">
e.g:
html(#app)
<div id="app">
<div id="target"></div>
<card></card>
</div>
const app = Vue.createApp({
})
app.component('card', {
data() {
return {
title: '文件標題',
content: '文件內文',
toggle: false
}
},
template: `
<div class="card" style="width: 18rem;">
<div class="card-body">
<h5 class="card-title">{{ title }}</h5>
<p class="card-text">{{ content }}</p>
<button type="button" @click="toggle = !toggle">切換元素顯示</button>
</div>
</div>
<teleport to="#target">
<div v-if="toggle" class="alert alert-danger" >被招喚的元素</div>
</teleport>
`,
});
app.mount('#app');
teleport限制
在使用teleport的時候,目標位置需要為已經可以取到DOM才可以傳送。
所以如果html順序執行下來,因為目前的元件還沒有完全掛載,下一個元件目前是不存在的。
如果這時候使用<teleport to="nextComponentDOM">
則會沒有辦法正確傳送
應用
更改網頁title
- html(#app)
- vue
<div id="app">
<div class="p-5">
<h1>會被更改的標題</h1>
<h3>實用技 巧(取代標題、多個)</h3>
<new-title></new-title>
</div>
</div>
const app = Vue.createApp({
})
app.component('new-title', {
template: `
<teleport to="title"> - 新增的標題片段</teleport>
<teleport to="h1"> - 新增的文字片段</teleport>
`
})
app.mount('#app');
info
受限於環境,無法於codepen展示
運作
- 多個Teleport共享目標 | Official
實際上在使用teleport
時會使用append
的方法將<teleport></teleport>
內的內容生成到目標位置的子層last-child
。
e.g:
<Teleport to="#modals">
<div>A</div>
</Teleport>
<Teleport to="#modals">
<div>B</div>
</Teleport>
渲染結果為
<div id="modals">
<div>A</div>
<div>B</div>
</div>