# Vue學習#19 v-slot ###### tags: `Vue 直播班 - 2022 春季班` ## 元件的編譯作用域 之前所學的知識都告訴我們,每個元件資料都是獨立的,就算 data 屬性名稱相同但是不同元件還是算不同屬性 但是! 模版內容出現了某種情況呢? [模版內容](https://codepen.io/binlandz123/pen/poaGVpV?editors=1010) 這個範例的重點是 ``` <card> {{ mes }} </card> // mes: 'child' <!-- card 元件 template 內容 '<div> card 元件內容 </div>' --> ``` 你可以看到元件的模板已經有內容了,但是在使用這個元件時,又在標籤內去渲染 {{ mes }} {{ mes }} 這個元件的 data 資料並不會被渲染,而是會被 template 模版內容取代 ### 原因 Vue 在編譯元件的 template 模板時,會以<font color='red'>元件模板所定義內容為主</font>,當元件從 created 進入了 beforeMount 階段時,會將網頁的模板進行編譯。 所以我們在元件 <card></card> 標籤內加入渲染內容,Vue 在元件編譯成網頁模板的時候會自動無視裡面的東西,並用子元件的內容來替換 所以當我們想要用別的內容來決定子元件的 template 長什麼樣子的話就需要使用 `v-slot` ## 什麼是 v-slot 可以藉由外層元件將內容決定子元件 template 模板的結構長什麼樣子 ## 使用方法 1. 在元件的 template 模板加入 `<slot></slot>` 標籤 2. 在 HTML 的元件標籤加入你想加入的標籤 EX: `<p></p>` 就完成了!!! ### [slot 簡單範例](https://codepen.io/binlandz123/pen/KKZjWoJ) ## 具名插巢 可以使用多個 `slot` 但是如果想要內容都不同的話,使用 `template` 標籤並將 slot 加上 `name` ,讓 slot 對應相對應的標籤 ### 具名插巢使用方法 1. slot 標籤加入 name , ex: `<slot name="g1">` 2. 在 HTML 加入 `template` 標籤,並將 slot 的 name 寫在 template 標籤中 , ex: `<template v-slot:g1></template>` 3. 如果想在 slot 加內容就寫在 template標籤中吧 4. 承第二步, `<template v-slot:g1></template>` 可以將 `v-slot:g1` 縮寫成 `#g1` ### [具名插巢](https://codepen.io/binlandz123/pen/vYpqmOd) ## 元件插巢 Props 可以將元件內部的資料透過 `props` 來給外層來使用 ### 注意! **這裡跟 父子元件之間用的 `props` 不太相同** 父子元件間的 `props` 是將父元件資料傳給子元件做使用,而這裡的 `props` 是指將內部元件的資料傳給外部的 slot 的地方來做使用 ### slotProps 使用方法 1. 在元件 `template` 模板的 slot 標籤加入 `:porpsName="內部元件 data"`,不須向父子元件 props 那樣先宣告 2. 在 html 的 元件標籤的 `<template v-slot:default="slotProps">`,在 slot 名稱後方加入一個自定義的 props 名稱 3. 接下來只要透過渲染這個自定義的 props 名稱就可以抓到資料哩 ### slotProps 可以傳入多值 1. 在元件 `template` 模板的 slot 標籤加入多個 props 2. slotprops 可以傳入多值只需要將 `<template v-slot:default="slotProps">` , 把 `slotprops` 改成 `{}` 物件的形式並放入 ### [slotProps](https://codepen.io/binlandz123/pen/KKZjqpa)