天天看點

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

有的時候我們會遇到這個場景,

代碼示例:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

就是我再調用一個 ​

​myform​

​,回到頁面上我們重新整理:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

你會發現多了一個input框,但是送出按鈕不見了,這是為什麼呢?‍‍

這是因為我使用你子元件的時候就沒給你傳插槽的值,‍‍是以這塊slot,你就拿不到slot的内容,就沒有東西展示。‍‍

一般比如說‍‍點選的按鈕,我是希望它如果你沒傳這個插槽,也應該有一個預設的展示,不然的話我這功能就不好用了。‍‍

遇到這個場景我們怎麼給它一個預設值,我們可以這樣去寫:

代碼示例:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

在調用slot的時候,‍‍在這兩個slot中間寫一個default value,然後回到頁面上我們重新整理,‍‍你會發現這個時候它就會出來default value了。

也就是如果你沒有傳插槽的内容的時候,‍‍我去調你插槽發現沒有内容,我就會用中間的 default value作為一個預設值。‍‍

大家看到的現在default value可以點選,

當然上面這兩個元件的調用,你傳了插槽,‍‍你傳了插槽之後我發現你有slot,那麼我就不會用預設值了。‍‍是以這是slot的一個預設值設定的文法,一定要記住。‍‍

還有一些場景,比如說這樣的一個例子:

代碼示例:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

代碼解讀:

我現在有一個div标簽,然後它的名字叫做layout,意思是布局,上面我也使用layout元件。

在這個布局裡我把 methods 去掉,它到底要展示什麼内容,完全是由父元件來告訴我的,‍‍

那麼父元件就要告訴它你展示什麼樣的一些内容,但是子元件裡有一些特殊的邏輯,比如說我現在有一個叫做content的區域,‍‍

這塊我寫一個content,

content頂部會有header,底部會有footer,我隻管 content 部分的展示,但是頭和尾到底要展示什麼?‍‍需要你父元件調我的時候來告訴我,‍‍

我要怎麼寫?

代碼示例:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

在這裡就要寫一個div,傳遞一個slot進去,告訴你頭和尾展示什麼。我

告訴你我有一個header,‍‍

然後我告訴你我還有一個footer,

執行效果:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

你會發現你header和footer就必須在content的上面,

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

或者你換一個位置,把slot放到content的‍‍下邊,

我們再來重新整理,效果如下:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

content變成最上面,header和footer變成最下面了。‍‍

也就是說我這麼去寫這兩個東西加在一起是一個slot:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

沒法做到一個效果 就是我把header放在content上面,‍‍footer放在content下面,

隻能說把這一個區塊整體放在content的上面或者content的下面,‍‍有沒有辦法解決這個問題?

有的有的。‍‍我們可以這樣去寫,在 div标簽上給它一個v-slot标簽,‍‍讓它等于一個header,

同樣的在下面也給一個v-slot标簽,讓它等于一個footer:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

也就是‍‍我告訴你的子元件,我傳遞的 slot,你把它拆成兩個部分,‍‍第一個部分起個名字叫做header,第二個部分起個名字叫做footer,

你看你不傳的時候,它是個整體,

現在你傳了這兩個東西,相當于你告訴它把一個大的slot拆成兩個部分,分别是header和footer,

那麼拆成兩個部分,你下面掉這個slot也不能整體去調用了,你必須再加一個name等于footer:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

告訴ta你拆分的 slot你要調的是哪一部分,我可以在下面調用的是footer這個部分,

在上面我調 slot的時候,我讓name等于header,

儲存一下,再回到我們的頁面上重新整理。‍‍這個時候它會有錯誤,我們看哪裡寫的不對?

此時代碼示例:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

我們發現直接把v-slot div 的标簽上 它是不認、不會生效的。如果你要這麼拆分,還要記住你要在外面加一個template‍‍這樣的一個占位符,‍‍

然後把你的v-slot标簽放到template上裡面去。‍‍

此時代碼示例:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

寫完這樣的代碼,我們再到頁面上重新整理,‍‍它還會提示我們現在有一點問題:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

這塊主要的原因我們回到代碼裡面,我這個文法寫的有一些問題, v-slot如果你給它做拆分的時候給它一個名字的話,‍‍不要用等号,要用冒号後面跟這個名字,這樣的一個文法才是正确的文法:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

我們再回到浏覽器重新整理,‍‍就沒有任何問題了:

【Vue】使用插槽和具名插槽解決元件内容傳遞問題(2)

我就可以把你傳遞過來的slot拆分成兩個部分,一部分放在‍‍ content的上面,header就展示在這裡,一部分放在content的下面,footer就在這裡。‍‍那麼剛才講的知識點,我們把它叫做具名插槽,怎麼了解具名插槽呢?‍‍

你可以這麼去了解,本身我一個插槽隻能一個大的區域一起去使用,但是我要把插槽拆成幾個部分,‍‍每個部分我在下面可以分開的調用,就要通過一個name來做區分了,

是以我們要給一個大的内容拆成幾個小的片段,每個片段要命上名字,‍‍這每一個小的片段,我們就把它叫做一個具名插槽,即: