這篇文章帶大家深入了解一下vue中的插槽(slot),帶你來玩Vue插槽,希望對大家有幫助!
在Vue 中,插槽是個很強大的功能,它可以讓封裝的元件彈性增強很多,例如你在封裝一個元件時使用了插槽,那在父元件呼叫時,這裡的內容就可以由父元件自由定義,而無需在封裝元件時苦想如何覆蓋各種使用場景。 (學習影片分享:vue影片教學)
假設我們現在有一個需要封裝的元件SlotComponent
<template> <div>这是一个slot:<slot> </slot></div> </template>
<SlotComponent>来自父组件的内容</SlotComponent>
在slot
中的內容就可以在父元件中任意定義。要是元件中沒有<slot>
元素,那麼在父元件呼叫時,元件起始和結束標籤之間的內容就會遺失掉。
既然slot
是在SlotComponent
元件中的,那在父元件中呼叫的時候能否能使用SlotComponent
元件裡的數據呢?顯然是不能的,因為他們所處的作用域並不相同。
父級模板裡的所有內容都是在父級作用域中編譯的;子模板裡的所有內容都是在子作用域中編譯的。
插槽也可以設定預設的內容,這有點像es6
中函數參數的默認值,當父元件呼叫時並沒有提供內容,那麼這個預設值就會被渲染出來。提供了內容的話,則會取代預設內容。
<template> <div> <slot>这是slot的默认内容</slot> </div> </template>
<DefaultSlot></DefaultSlot>
在呼叫時標籤之間並沒有提供內容,預設值得以渲染,成為一個兜底內容。
如果在元件中我需要多個地方用到插槽,那就需要給slot
新增name
,來區分內容渲染到什麼地方。
// named slot,名字叫 NamedSlot <template> <div> 这是具名插槽 <div> <slot name="slot1"></slot> </div> <div> <slot name="slot2"></slot> </div> <div> <slot name="slot3"></slot> </div> </div> </template> // 在父组件中调用 <NamedSlot> <template v-slot:slot1>这是插入slot1的内容</template> <template v-slot:slot2>这是插入slot2的内容</template> <template v-slot:slot3>这是插入slot3的内容</template> </NamedSlot>
給 slot
加上 name
屬性後,可以透過 v-slot:slotName
的形式來分發內容。不給name
屬性的話,就預設name
為default
,等同於v-slot:default
,也可以縮寫為#default
。
注意, v-slot
只能加入在 <template>
上 ,但是也有特殊情況,後面會講到。
透過slot
,我們可以在父元件為子元件新增內容,但是父子元件的作用網域是不同的,我們想在父元件使用子元件的資料該怎麼辦?
可以在子元件 <slot>
元素上綁定屬性,值為你需要傳遞給父元件的內容。
// 子组件 组件名称为 SlotProp <div> <slot name="slot1" :value1="child1"></slot> <slot name="slot2" :value2="child2"></slot> </div> //调用 <SlotProp> <template v-slot:slot1="slotProps"> {{ slotProps.value1 }} </template> <template v-slot:slot2="slotProps"> {{ slotProps.value2 }} </template> </SlotProp>
簡單來說,就是在slot
上透過:key='value'
的形式綁定一個值,
在父元件呼叫時,透過v-slot:slotName="slotProps"
的形式拿到這個值,slotProps
名稱可以自己定義,
再透過slotProps [key]
去拿這個值。
如果元件只有一個預設模版的話,是可以不用在template
上寫v-slot:slotName="slotProps"
的,可以直接在元件名稱上寫v-slot
<SlotProp v-slot:default="slotProps"> {{ slotProps.value1 }} </SlotProp>
上面提到過,未指定name
就會被認為是default
,這裡也是同理,v-slot:default="slotProps"
可以簡稱為v-slot="slotProps"
。
作用域插槽的內部運作原理是將你的插槽內容包含在一個傳入單一參數的函數裡
基於插槽的實作原理,我們也可以使用一些ES6
的語法來操作slotProps
,例如解構,prop重新命名和賦預設值等。
// 解构 <SlotProp v-slot="{ value1 }"> {{ value1 }} </SlotProp> // 重命名,将 value1 重命名为 name1 <SlotProp v-slot="{ value1: name1 }"> {{ name1 }} </SlotProp> // 赋默认值 <SlotProp v-slot="{ value1 = '这是默认值' }"> {{ value1 }} </SlotProp>
slot
支援透過<template v-slot:[dynamicSlotName]>
這樣的方式來實現動態插槽。
有時在一個基礎元件中循環了插入了多個slot
,例如這樣
<div v-for="item in slotList" :key="item"> <slot :name="item"></slot> </div>
在呼叫的時候就可以使用動態插槽名稱 循環來動態渲染對應的slot
<template v-for="item in slotList" v-slot:[item] > {{item}} </template>
以上是一文解析Vue中的插槽(slot)的詳細內容。更多資訊請關注PHP中文網其他相關文章!