古詩詞大全網 - 藝術簽名 - Vue組件化開發(三)——slot插槽的使用

Vue組件化開發(三)——slot插槽的使用

相信有過項目開發經驗的小夥伴壹定知道,在項目中往往會有多個地方需要用到樣式相似,細節略有差異的組件,比如說導航欄和搜索欄,這些組件出現頻率比較高,但是在不同的場景下我們對於導航欄的內容有著不同的需要。而如果為了這點細微的區別再專門寫壹個組件會十分麻煩,而且復用性也很低。

可能有些讀者會覺得,這不難解決,對於子組件中不確定的地方我們可以交由父組件的props傳值來進行解決,比如導航欄中的標題,我們可以都交由父組件傳值來實現。(比如下面的導航欄1和導航欄2)

不錯,當組件的變化程度不大時,這確實可以十分方便地解決組件復用的問題。但如果說我想要實現根據不同的場景,導航欄中部的位置可能是標題,也有可能是下拉框,是搜索框或者是其他自定義的組件呢?此時我們就很難單純通過 props 來拓展我們的組件靈活性了。(比如下面的導航欄1和導航欄3)

在子組件中,使用特殊的元素<slot>就可以為子組件開啟壹個插槽。該插槽插入什麽內容取決於父組件如何使用。我們可以看壹下下面這個案例:

我們壹***在Vue實例中使用了2次子組件,第壹次父組件沒有往子組件中傳遞元素,第二次父組件有往子組件傳遞元素。

從結果上看,當父組件沒有往子組件插槽中添加元素時,則會展示插槽中默認的內容,而如果父組件有傳遞插槽內容,則會覆蓋插槽的默認內容,而後進行顯示。

在第二小節中,我們已經知道了插槽的基本使用,但是當子組件的功能比較復雜時,我們可能就要在組件中定義多個插槽,來滿足更加靈活的業務需要。比如上面舉例的京東導航欄,這個組件內部可以拆分為三個插槽,分別對應 三個位置的內容。

但想要在組件內預留多個插槽有個前提條件,就是我們必須要讓每個插槽都有其對應的唯壹標識,這樣父組件傳遞內容的時候,才能識別出來哪些內容對應哪個插槽。

我們可以看壹下下面這個案例:

子組件內定義了三個具名插槽,我們在父組件中進行子組件的調用,需要註意的是我們並沒有完全按照順序去傳遞對應插槽的內容。但實際上從演示結果中我們可以發現, 無論父組件傳遞的插槽內容順序如何,最終解析的時候都會將傳入的插槽內容根據 slot name 進行正確的渲染的

在講解作用域插槽之前,我們需要先對 編譯作用域 進行理解。具體表現在 父組件模板的所有東西都會在父級作用域內編譯;子組件模板的所有東西都會在子級作用域內編譯。

我們可以通過下面這個案例來理解這個規則:

父組件和子組件都使用了 isShow 來控制組件的顯示,同時在父子組件的data中,又都有同名的變量 isShow 。我們從結果中可以看到,定義在在父組件中子組件,其組件是否可見取決於父組件data中的變量值。而在子組件template中定義的 isShow 標識,則受子組件自身data變量的約束,也就是說此處子組件模板的變量取的是子級作用域中的變量值。

在上壹小節的演示中,我們已經可以了解到編譯作用域的概念,也知道了父組件無法直接使用子組件內部的數據(因為子組件模板內部的數據是在子組件的作用域中的)。但 有些場景下,我們又會需要父組件可以替換插槽的標簽,但是內容由子組件來提供。 那麽,此時我們就可以使用作用域插槽來解決這個問題。

我們可以來看壹下下面這個案例:子組件中存在壹個數組,現在我們想要通過插槽的方式,來根據不同的需要實現數組的展示方式:

在父組件中,我們定義了2種展示數據的方式,壹種為展示為列表形式,還有壹種是每種語言以 -- 進行分割。在使用上,子組件需要在插槽處通過 :data 的方式提供對外暴露的數據,父組件在使用的時候,則是先在子組件內部定義 <template> 標簽,從 slot-scope 屬性中取出slotProps參數(其實slotProps就是壹個對象,裏面封裝著所有子組件插槽對外暴露的數據)。

我們通過 slotProps.data 就可以獲取到我們在子組件插槽中封裝的data數據啦

至此,有關插槽的內容就到此結束啦,作用域插槽多見於常見的組件庫中(比較多是在table組件中出現),所以最好要熟悉插槽的原理和使用,這樣可以更好地簡化我們的開發工作