Vue2 插槽的使用【默認(rèn)插槽、具名插槽、作用域插槽】

2023-1-12    前端達(dá)人

一:什么是插槽

       例如老板要讓你使用組件寫分類欄,然后使用該組件生成兩個分類欄,這兩個分類欄里的數(shù)據(jù)都不一樣,但是整體結(jié)構(gòu)是一樣的,這就要求組件的結(jié)構(gòu)一樣,但是內(nèi)部 DOM 結(jié)構(gòu)是由使用組件的時候決定的,這就需要插槽,其就像放在組件中的占位標(biāo)簽,使用組件時我們將要放到占位標(biāo)簽處的DOM結(jié)構(gòu)寫入組件標(biāo)簽體中即可。

       例如如下圖例子,第一個分類框我們要展示熱門電影,第二個分類框我們要展示一張風(fēng)景圖,整體的框架是一樣的,只是其內(nèi)部填充的東西不一樣下面會做出更深刻的理解。


二:默認(rèn)插槽 

2.1 默認(rèn)插槽說明

      此板塊我們講述第一個插槽:默認(rèn)插槽。之前我們使用組件的時候,引入進(jìn) App.vue 后注冊就可以采用 自閉合 與  完整組件標(biāo)簽 的方式使用,以下就是常采用的自閉合與完整組件標(biāo)簽方式(以 test組件為例)


    
  1. <template>
  2. <test/> //自閉合方式
  3. <test></test> //完整組件標(biāo)簽的方式
  4. </template>

         但是插槽的使用我們就要把要放在插槽中的內(nèi)容寫在組件標(biāo)簽體內(nèi),例如我們要在插槽中放入一個 ul 列表,那么我們使用組件時就要這樣書寫:


    
  1. <template>
  2. <test> //組件標(biāo)簽
  3. <ul>
  4. <li></li>
  5. <li></li>
  6. <li></li>
  7. </ul>
  8. </test>
  9. </template>

       接下來說說默認(rèn)插槽的寫法,如果我們只在使用組件時的組件標(biāo)簽體內(nèi)寫上內(nèi)容,那頁面上是顯示不出來任何東西的,這是因為標(biāo)簽體內(nèi)的內(nèi)容確實被解析了,但是vue不知道要把這些東西放在組件中 template 的哪個位置,故我們要在組件的 template 中設(shè)置一個插槽來占位,以保證使用組件時其解析的內(nèi)容可以放入占的位置中去。占位我們使用一個很重要的標(biāo)簽 ------ slot,我們需要在組件的 template 中這樣書寫:


    
  1. <template>
  2. <div>
  3. <span>我是一個組件,下面是我的插槽內(nèi)容</span>
  4. <slot></slot> //默認(rèn)插槽
  5. </div>
  6. </template>

這樣使用組件時組件標(biāo)簽體中的內(nèi)容就可以放入組件的默認(rèn)插槽中了

2.2 默認(rèn)插槽使用 

       我們來實現(xiàn)一下上述的分類案例,讓第一個分類展示電影,第二個分類放一張圖片進(jìn)去,但整體組件結(jié)構(gòu)一樣

 classify.vue組件:


  1. <template>
  2. <div class="classify-box">
  3. <div class="title">{{name}}</div>
  4. <slot></slot> //slot設(shè)置默認(rèn)插槽來占位
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name:'Classify',
  10. data() {
  11. return {
  12. }
  13. },
  14. props:['name'] //propos接收傳來的標(biāo)題名稱
  15. }
  16. </script>
  17. <style scoped>
  18. //css太占地方就刪掉了
  19. </style>

App.vue組件:


  1. <template>
  2. <div class="app-box">
  3. <Classify name='熱門電影'> //使用組件并在組件標(biāo)簽體中書寫要放進(jìn)插槽中的內(nèi)容
  4. <ul>
  5. <li>肖申克的救贖</li>
  6. <li>1912</li>
  7. <li>零的執(zhí)行人</li>
  8. </ul>
  9. </Classify>
  10. <Classify name="風(fēng)景">
  11. <img src="./img/QQ圖片20220818163031.jpg" alt="">
  12. </Classify>
  13. </div>
  14. </template>
  15. <script>
  16. import Classify from './components/classify.vue' //引入組件
  17. export default {
  18. name: 'App',
  19. data() {
  20. return {
  21. }
  22. },
  23. components: {
  24. Classify:Classify //注冊組件
  25. }
  26. }
  27. </script>
  28. <style scoped>
  29. //css太占位置刪掉了
  30. </style>

這樣就可以實現(xiàn)一個最基本的默認(rèn)插槽案例了 


三:具名插槽 

3.1 具名插槽說明

       具名插槽其實只是在默認(rèn)插槽的基礎(chǔ)上給每個插槽起了名字,作用為可以在組件中設(shè)置多個插槽,可以更具體細(xì)分。首先給組件插槽起名字,使用 name="xxx"


    
  1. <template>
  2. <div>
  3. <span>我是一個組件,下面是我的多個具名插槽內(nèi)容</span>
  4. <slot name="header"></slot> //header具名插槽
  5. <slot name="body"></slot> //body具名插槽
  6. <slot name="footer"></slot> //footer具名插槽
  7. </div>
  8. </template>

        上面就在組件中定義好了三個具名插槽,下面我們來看使用插槽的寫法,依舊是在使用組件標(biāo)簽時在標(biāo)簽體內(nèi)寫入內(nèi)容,但是要注意要使用 slot="xxx" 寫在組件標(biāo)簽體外層盒子上來指明放入哪個插槽中


    
  1. <template>
  2. <div class="app-box">
  3. <Classify>
  4. <div slot="header"> //放入header插槽
  5. <span>我在header插槽中</span>
  6. </div>
  7. <div slot="body"> //放入body插槽
  8. <span>我在body插槽中</span>
  9. </div>
  10. <div slot="footer"> //放入footer插槽
  11. <span>我在footer插槽中</span>
  12. </div>
  13. </Classify>
  14. </div>
  15. </template>

       上面的寫法其實并不完善,slot寫在每個指定插槽的外層大盒子 div 上了,這樣會給其增加一層 DOM 結(jié)構(gòu),我們最好把 div 換成 template 標(biāo)簽,因為 template 標(biāo)簽不會被解析,結(jié)構(gòu)更清晰不多余。

3.2 具名插槽使用

下面簡單實現(xiàn)一下具名插槽的使用

 classify.vue組件:


  1. <template>
  2. <div class="classify-box">
  3. <div class="title">下面是具名插槽的內(nèi)容</div>
  4. <slot name="header"></slot>
  5. <slot name="body"></slot>
  6. <slot name="footer"></slot>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. name:'Classify',
  12. data() {
  13. return {
  14. }
  15. },
  16. }
  17. </script>
  18. <style scoped>
  19. </style>

App.vue組件:


  1. <template>
  2. <div class="app-box">
  3. <Classify>
  4. <div slot="header">
  5. <span>我在header插槽中</span>
  6. </div>
  7. <div slot="body">
  8. <span>我在body插槽中</span>
  9. </div>
  10. <div slot="footer">
  11. <span>我在footer插槽中</span>
  12. </div>
  13. </Classify>
  14. </div>
  15. </template>
  16. <script>
  17. import Classify from './components/classify.vue'
  18. export default {
  19. name: 'App',
  20. data() {
  21. return {
  22. }
  23. },
  24. components: {
  25. Classify:Classify
  26. }
  27. }
  28. </script>
  29. <style scoped>
  30. </style>

這樣就簡單實現(xiàn)了具名插槽 


四:作用域插槽 

4.1 作用域插槽說明

       作用域插槽較難理解,但其簡單解釋就是帶有數(shù)據(jù)的插槽,把組件中的數(shù)據(jù)綁定給插槽,然后誰使用這個組件誰就能拿到這個數(shù)據(jù)使用,也相當(dāng)于一種數(shù)據(jù)通信,其需要這樣把數(shù)據(jù)綁定定義給組件插槽(名稱沒有要求)


    
  1. <template>
  2. <div class="classify-box">
  3. <div class="title">下面是作用域插槽的內(nèi)容</div>
  4. <slot :hobby="hobby"></slot> //將數(shù)據(jù)綁定給組件插槽
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name:'Classify',
  10. data() {
  11. return {
  12. hobby:['打游戲','睡大覺','吃大餐'] //要綁定的數(shù)據(jù)
  13. }
  14. },
  15. }
  16. </script>

然后就要使用組件時使用 slot-scope="xxx" 去接收,或者直接使用 scope,要注意的是此處標(biāo)準(zhǔn)一點最好寫在 template 中,這里的 xxx 不需要和組件插槽中起的名字一樣,隨便起就行。然后我們打印一下接收到的數(shù)據(jù)看看其是什么


    
  1. <template>
  2. <div class="app-box">
  3. <Classify>
  4. <template slot-scope="datas">
  5. <div>{{datas}}</div>
  6. </template>
  7. </Classify>
  8. </div>
  9. </template>

       可以看到我們接受到了一個對象,對象中包含的是你插槽中綁定的所有數(shù)據(jù)(我們只綁定了一個所以對象里只有一組數(shù)據(jù)),對此我們就能在組件標(biāo)簽體中使用得到的數(shù)據(jù)了

 

4.2 作用域插槽使用

下面簡單實現(xiàn)一下作用域插槽的使用

 classify.vue組件:


  1. <template>
  2. <div class="classify-box">
  3. <div class="title">下面是作用域插槽的內(nèi)容</div>
  4. <slot :hobby="hobby"></slot>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name:'Classify',
  10. data() {
  11. return {
  12. hobby:['打游戲','睡大覺','吃大餐']
  13. }
  14. },
  15. }
  16. </script>
  17. <style scoped>
  18. </style>

App.vue組件:

此處 slot-scope 接收的數(shù)據(jù)使用了es6解構(gòu)把數(shù)據(jù)解構(gòu)出來了


  1. <template>
  2. <div class="app-box">
  3. <Classify>
  4. <template slot-scope="{hobby}">
  5. <ul>
  6. <li v-for="(h,index) in hobby" :key="index">{{h}}</li>
  7. </ul>
  8. </template>
  9. </Classify>
  10. </div>
  11. </template>
  12. <script>
  13. import Classify from './components/classify.vue'
  14. export default {
  15. name: 'App',
  16. data() {
  17. return {
  18. }
  19. },
  20. components: {
  21. Classify:Classify
  22. }
  23. }
  24. </script>
  25. <style scoped>
  26. </style>

這樣就簡單實現(xiàn)了作用域插槽的案例

 感謝支持'


 來源:csdn

藍(lán)藍(lán)設(shè)計建立了UI設(shè)計分享群,每天會分享國內(nèi)外的一些優(yōu)秀設(shè)計,如果有興趣的話,可以進(jìn)入一起成長學(xué)習(xí),請加微信ban_lanlan,報下信息,藍(lán)小助會請您入群。歡迎您加入噢~~
希望得到建議咨詢、商務(wù)合作,也請與我們聯(lián)系01063334945。 

分享此文一切功德,皆悉回向給文章原作者及眾讀者. 免責(zé)聲明:藍(lán)藍(lán)設(shè)計尊重原作者,文章的版權(quán)歸原作者。如涉及版權(quán)問題,請及時與我們?nèi)〉寐?lián)系,我們立即更正或刪除。 

藍(lán)藍(lán)設(shè)計www.bouu.cn )是一家專注而深入的界面設(shè)計公司,為期望卓越的國內(nèi)外企業(yè)提供卓越的UI界面設(shè)計、BS界面設(shè)計 、 cs界面設(shè)計 、 ipad界面設(shè)計 、 包裝設(shè)計 、 圖標(biāo)定制 、 用戶體驗 、交互設(shè)計、 網(wǎng)站建設(shè) 、平面設(shè)計服務(wù)、UI設(shè)計公司、界面設(shè)計公司、UI設(shè)計服務(wù)公司、數(shù)據(jù)可視化設(shè)計公司、UI交互設(shè)計公司、高端網(wǎng)站設(shè)計公司、UI咨詢、用戶體驗公司、軟件界面設(shè)計公司

分享本文至:

日歷

鏈接

個人資料

存檔