『學習筆記』Vue3 系列 — 什麼是插槽(Slots)?

我們知道 Props 可以在組件間傳遞資料,但當我們想要傳遞 DOM 內容,讓組件在不同地方渲染不同的內容,同時又具有相同的樣式時,可以透過插槽(Slots)的方式,即可把父組件的內容展示在子組件中指定的位置

主要可分為以下四種插槽:

  1. 匿名插槽(Slots):把父組件內容塞到子組件的插槽裡。
  2. 具名插槽(Named Slots):使用固定的插槽名稱(靜態值),把父層的內容分配到指定位置。
  3. 動態插槽(Dynamic Slot Names):使用動態的插槽名稱,在父層動態指定位置。
  4. 作用域插槽(Scoped Slots):讓子組件在渲染時,將一部分資料提供給插槽。

📌 子組件要先建立 slot,父組件才可以把內容塞進去。插槽內容可以傳入文本、多個元素(DOM內容),甚至是組件。

匿名插槽

渲染後會變成:

我們也可以為插槽指定默認內容。當父組件無插槽內容時,就會渲染默認內容,只要將默認內容寫在 <slot> 標籤中即可。

子組件(FancyButton.vue)
父組件

渲染後會變成:

因父組件無提供插槽內容,”Default” 會被當作默認內容被渲染

具名插槽

當需要一種方式將多個插槽內容傳入到各自目標插槽的出口,此時就需要用到具名插槽了。

<template v-slot:<插槽名> > or 簡寫為<template #<插槽名> >

子組件(BaseLayout.vue)
父組件

渲染後會變成:

動態插槽名

在父組件可以動態指定不同的 slot,把內容塞到子組件裡面

<template v-slot:[ <動態插槽名> ]> or 簡寫為<template #[ <動態插槽名> ]>

子組件(Area.vue)
父組件

渲染後會變成:

作用域插槽

一般來說,插槽的內容無法訪問到子組件的狀態。在這裏,我們可以使用作用域插槽,把子組件的資料傳出去給父組件使用和處理,再塞回子組件的插槽裡。

📌 渲染作用域

組件模板中的表達式只能訪問父組件的作用域組件模板中的表達式只能訪問子組件的作用域

子組件(MyComponent.vue)
父組件

渲染後會變成:

搭配具名插槽使用 — 具名作用域插槽

子組件(MyComponent.vue)
父組件

渲染後會變成:

插槽上的 name 是一個Vue 特別保留的attribute,不會作為props 傳遞給插槽。

參考資料:

官方練習編譯器:

--

--

Shih Ting, Tai

Enhance overall happiness by improving human-computer interaction to benefit people.