天天看點

(十二)vue.js元件——進階篇之slot插槽(4)

概述

我們已經知道,現在的web應用及其頁面,基本都是由各個元件組合形成,那麼這個時候我們【如何較好的組合各個元件】就成為了我們需要關心的問題了

場景

想象下,對于各個元件組合使用的場景,如果我們要在布局元件中包裹三個元件: 導航元件、内容元件、頁腳元件

這時,我們該如何實作?

我們隻能在定義布局元件時就引入這三個元件!

問題

如果這樣實作的話,先不說可擴充性,就是萬一哪天我們這三個元件的名字變了?或者不在引入這三個元件了,決定引入其他元件。

那這個布局元件豈不是就無法運作了?

slot救場

這時slot出現了,Slot便是為了更好的實作元件的組合而出現,特别是父子元件的内容。

Slot能夠高擴充高複用的實作一個元件包裹另一個元件甚至是多個元件。

slot說明

下面我們來看看slot的詳細的作用和用法:

① 一般而言,元件标簽間的内容會被抛棄

正常情況下,我們在自定義元件标簽中定義的任何内容,都會被抛棄。都隻會渲染出元件模闆内容。

(十二)vue.js元件——進階篇之slot插槽(4)

② Slot可以把内容渲染進子元件

而如果我們使用slot就能實作讓我們的内容渲染進行子元件中,達到如同使用網頁标簽一樣使用我們的元件标簽。

(十二)vue.js元件——進階篇之slot插槽(4)

可以看到隻是在子元件中加了一個slot就實作了,子元件中slot标簽會自動的替換為父元件放入到子元件标簽間的内容

③ 即便元件标簽中放入其他元件也能渲染進去

(十二)vue.js元件——進階篇之slot插槽(4)

④ slot中可以給預設值

(十二)vue.js元件——進階篇之slot插槽(4)

⑤ Slot給我們帶來的好處

1.讓我們如同使用網頁标簽一樣使用元件标簽
2.當我們要讓元件組合使用,比如混合父元件的内容與子元件的模闆時,特别有用。
3.具體場景: 回憶下之前的場景
           

⑥ 具名slot (具有名字的插槽)

還是以我們之前的布局元件

<base-layout>

元件為例

這個元件中由header+main+footer三部分組成。

那麼我們可以把頭,體,尾這三部分别作為一個slot,等待元件調用者傳入相應内容。

那麼這時就可以使用具名插槽。(具有name屬性的插槽)

完整代碼如下

(十二)vue.js元件——進階篇之slot插槽(4)

調用方式和運作結果

(十二)vue.js元件——進階篇之slot插槽(4)

從上可知:

1.然後具名slot可以和 沒有名字的預設slot 共存,父元件中沒有綁定具名
slot的元素都将出現在子元件的預設slot中。【如果有多個無名的slot,
那就會渲染插入多次】
           
(十二)vue.js元件——進階篇之slot插槽(4)
2.如果父元件中含義沒有綁定具名slot的元素,但是子元件中卻無匿名默
認slot時,父元件的那些原生将會被抛棄
           
(十二)vue.js元件——進階篇之slot插槽(4)

⑦ 作用域插槽

場景

想象下,有這樣一個場景:
現在你同僚給了你一個清單元件,他内置了一個數組用于渲染清單。
這些都沒問題,但是對于這個元件渲染的效果你并不滿意。
然後你叫你同僚修改渲染布局與樣式,第一次,你同僚很爽快的同意給你改了。
随着需求發生變化,你對渲染布局和樣式又不滿意了,第二次,你同僚仍然爽快的
給你改了。
不久,需求又變了, 然後,第三次.....第n次.......
然後,你已經不好意思再去找同僚修改了,這時該怎麼辦?
你可能在想,渲染那部分,你同僚直接寫成一個插槽slot,渲染效果作為預設值就行。
這樣你可以根據需求随時自己寫新的渲染布局進去。這樣多好。
沒錯,想的非常好,可是你忽略了一個問題,那就是資料。。。。
這裡面資料是内置的,而且這個資料是恒定而重要的,是以不需要外部參數。
 那麼這時你該怎麼辦?這時你肯定想要是我寫slot插槽時能夠拿到同僚元件中的内
 置資料該多好。
好吧,這時,你就可以使用作用域插槽了,什麼是作用域插槽?
能夠拿到子元件資料的插槽就叫做作用域插槽。完美的滿足了你的需求。
           

預設元件渲染效果

(十二)vue.js元件——進階篇之slot插槽(4)

作用域插槽實作

可由你決定效果的,具有作用域插槽的元件

(十二)vue.js元件——進階篇之slot插槽(4)

解釋:

作用域插槽的用法主要有兩點

1.在子元件中寫slot插槽時,給上屬性(這些屬性能夠被父元件拿到)

2.在父元件中渲染内容時一般寫template标簽,并且标簽上有個scope屬性,這個屬性的值為一個對象,就是子元件的slot插槽上所有屬性的集合。

3.在父元件中就可以通過scope屬性值這個對象操作子元件提供的資料。

(十二)vue.js元件——進階篇之slot插槽(4)

然後提示下:作用域插槽也是可以具名的,即為一個擁有名字的slot.

(十二)vue.js元件——進階篇之slot插槽(4)

⑧ 通路slot插槽

在vue2中,我們可以通過$slots通路目前元件中的所有slot插槽。

(十二)vue.js元件——進階篇之slot插槽(4)

注意: 空文本元素也會作為擷取的slot數組中的一個元素。

$slots在獨立元件開發中比較有用。