2023 Vue直播班筆記 - Slot插槽

更新於 發佈於 閱讀時間約 6 分鐘
筆記以個人清楚理解方式記錄

前言

插槽是甚麼?插槽是父元件針對子元件內的某區塊根據不同需求提供不同樣板渲染的功能,也可以說是父元件對於子元件內該區塊的延伸應用,其中包含

  • 具名
  • 默認預設


以下以簡單的圖例說明:

默認插槽

<div id="app">
<h3>Slot 插巢與插巢預設值</h3>
<card></card>
<br>
<card></card>
</div>

<script type="module">
const app = Vue.createApp({});
app.component('card', {
template: `
<div class="card" style="width: 18rem;">
<div class="card-header">
元件 Header
</div>
<div class="card-body">
<p>這段是預設的文字</p>
</div>
<div class="card-footer">
元件 Footer
</div>
</div>`
})
app.mount('#app');
</script>
raw-image


這時我們如果想把card內某個區塊釋放出來要怎麼做呢?

這邊以<p>這段是預設的文字</p> 來展示,把它釋放後會變成

app.component('card', {
template: `
<div class="card" style="width: 18rem;">
<div class="card-header">
元件 Header
</div>
<div class="card-body">
<slot></slot>
</div>
<div class="card-footer">
元件 Footer
</div>
</div>`
})
raw-image


子元件釋放出了空間,我們便可以加以應用它,

因此我們可以在父元件放入自己寫的HTML,

如果外層有定義會先優先引用外層定義的HTML,

沒有則會引用子元件自己本身<slot></slot>內的HTML

<div id="app">
<h3>Slot 插巢與插巢預設值</h3>
<card>
<p>我是父元件定義的</p>
</card>
<br>
<card></card>
</div>
raw-image


由於未具名,所以這是屬於插槽默認的預設值插槽行為,

但是如果有需求要指定各部位顯示的話呢?


具名插槽 / 具名插槽縮寫

我們先準備第二組範例card2

<div id="app">
<h3>具名插巢</h3>
<card2>
<template>我喜歡這張卡片</template>
<!-- 預設請加入 default -->
<template>這是卡片 2</template>
<template>這是卡片腳</template>
</card2>
</div>
<script type="module">
const app = Vue.createApp({});
app.component('card2', {
template: `<div class="card" style="width: 18rem;">
<div class="card-header">
<slot>元件 Header</slot>
</div>
<div class="card-body">
<slot>這段是預設的文字</slot>
</div>
<div class="card-footer">
<slot>元件 Footer</slot>
</div>
</div>`
});

app.mount('#app');
</script>


這時我們可以發現HTML部分變成<template>標籤了,

而JS則有3塊<slot>,但是多開<slot>時沒給的名稱,

外層會不知道哪個要插哪的冏境,因此我們要給它個名稱name

app.component('card2', {
template: `<div class="card" style="width: 18rem;">
<div class="card-header">
<slot name="header">元件 Header</slot>
</div>
<div class="card-body">
<slot>這段是預設的文字</slot>
</div>
<div class="card-footer">
<slot name="footer">元件 Footer</slot>
</div>
</div>`
});


中間先刻意不加name展示,而內層已經有name了,

我們外層也給跟內層配合,所以要針對各<template>下達 v-slot:(內層名稱),

而中間剛剛刻意不加name這時如果有需要讓其也對應的話,

我們也可以幫它加個 v-slot:default 如下圖

<div id="app">
<h3>具名插巢</h3>
<card2>
<template v-slot:header>我喜歡這張卡片</template>
<!-- 預設請加入 default -->
<template v-slot:default>這是卡片 2</template>
<template v-slot:footer>這是卡片腳</template>
</card2>
</div>


此時結果就會變這樣
raw-image


可以隨個人需求調整的slot就完成了~


具名縮寫插槽

嫌v-slot太長嗎? 這邊也提供懶人寫法,

以剛剛的v-slot為例,只要將其改成如下就完成囉~

<div id="app">
<h3>具名插巢縮寫</h3>
<card2>
<template #header>我喜歡這張卡片</template>
<template #default>這是卡片 2</template>
<template #footer>這是卡片腳</template>
</card2>
</div>


  • joker
  • 2024/02/15
avatar-img
3會員
21內容數
是一隻喜愛前端勇往直前的霹靂酷樂貓
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
你可能也想看
Google News 追蹤
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
有B班的人在敲碗怎麼不教多一點,其實都累積在A班了,我寫了850篇文章,幾乎都跟選擇權相關。要從這裡挖技術與資料就來這邊訂閱吧! https://vocus.cc/pay/salon/once/645345c1fd897800018c8aec?planId=640b0bb8fd8978000131
Thumbnail
CSS 盒模型是理解和設計網頁佈局的核心概念。它包括元素的內容、填充、邊框和外邊距。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
從 Vue 班畢業已經 1 個多月,最近也轉職成功,終於有機會把這段歷程記錄下來,當作一個里程碑。此次參加 Vue 班,心境上最大的不同,大概是知道自己即將在完課後,踏上求職道路。所以如果能在課堂期間 2 個月內完成求職作品,我就能提早出發。 ▍學習狀況 雖然先前有稍微玩過 Vue,但也早已
Thumbnail
Vocus 新增了沙龍功能,目的是為了取代原本的「專題」,我這篇就來分享一下我目前摸索沙龍的經驗
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
有B班的人在敲碗怎麼不教多一點,其實都累積在A班了,我寫了850篇文章,幾乎都跟選擇權相關。要從這裡挖技術與資料就來這邊訂閱吧! https://vocus.cc/pay/salon/once/645345c1fd897800018c8aec?planId=640b0bb8fd8978000131
Thumbnail
CSS 盒模型是理解和設計網頁佈局的核心概念。它包括元素的內容、填充、邊框和外邊距。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
從 Vue 班畢業已經 1 個多月,最近也轉職成功,終於有機會把這段歷程記錄下來,當作一個里程碑。此次參加 Vue 班,心境上最大的不同,大概是知道自己即將在完課後,踏上求職道路。所以如果能在課堂期間 2 個月內完成求職作品,我就能提早出發。 ▍學習狀況 雖然先前有稍微玩過 Vue,但也早已
Thumbnail
Vocus 新增了沙龍功能,目的是為了取代原本的「專題」,我這篇就來分享一下我目前摸索沙龍的經驗