Vue的内容分发slot的使用
什么是內容分發??
概括:將父組件的內容放到子組件指定的位置
場景:在使用組件時,我們常常需要像這樣組合使用
< app>< app-header>< /app-header>< app-footer>< /app-footer> < /app> 復制代碼此時有兩個點需要注意:
- < app> 組件不確定自己所接收的數據。這是由使用 < app> 的父組件所決定的。
- < app> 作為一個組件使用,可能有自己的模板。
所以為了讓組件可以很好的組合使用,我們需要一種方式來混合父組件的內容與子組件自己的模板。這個過程被稱為內容分發,也就是將父組件的內容放到子組件的指定位置。
此時的message應該綁定的是父組件的數據還是子組件的數據?答案是父組件,這就是編譯作用域。再看一個很容易犯錯誤的例子:
//childProperty是子組件中的屬性,此時的代碼不會如我們預期生效。父組件模版不能取到子組件中的狀態 < child-component v-show="childProperty">< /child-component> 復制代碼根據編譯作用域,此時正確的做法應該是在子組件模版中進行操作,綁定到相對應的節點中,如下:
Vue.component('child-component', {// 有效,因為是在正確的作用域內template: '< div v-show="childProperty">Child',data: function () {return {childProperty: true}} }) 復制代碼單個插槽
場景: 當在父組件模版中使用子組件時,父組件的內容將會被丟棄,如下子組件child-component:
< div>< h2>我是子組件的標題< /h2> < /div> 復制代碼父組件模板:
< div>< h1>我是父組件的標題< /h1>< child-component>< p>這是一些初始內容< /p>< p>這是更多的初始內容< /p>< /child-component> < /div> 復制代碼此時的渲染結果為:
< div>< h1>我是父組件的標題< div>< h2>我是子組件的標題< /h2>< /div>復制代碼此時父組件里面的內容就會被替換,此時的解決方法是可以使用slot單個插槽,例如在上面的子組件child-component中:
< div>< h2>我是子組件的標題< /h2>< slot>在沒有要分發的內容時才會顯示。< /solt> < /div> 復制代碼此時的渲染結果就是 :
< div>< h1>我是父組件的標題< div>< h2>我是子組件的標題< /h2>< p>這是一些初始內容< /p>< p>這是更多的初始內容< /p>< /div>復制代碼此時的父組件的內容不會被丟棄。子組件模板只有一個沒有屬性的插槽時,父組件傳入的整個內容片段將插入到插槽所在的 DOM 位置,并替換掉插槽標簽本身。 最初在 標簽中的任何內容都被視為備用內容。備用內容在子組件的作用域內編譯,并且只有在宿主元素為空,且沒有要插入的內容時才顯示備用內容。
具名插槽
元素可以用一個特殊的特性 name 來進一步配置如何分發內容。多個插槽可以有不同的名字。具名插槽將匹配內容片段中有對應 slot 特性的元素。仍然可以有一個匿名插槽,它是默認插槽,作為找不到匹配的內容片段的備用插槽。如果沒有默認插槽,這些找不到匹配的內容片段將被拋棄。如下一個child-layout:
< div class="container">< header>< slot name="header">< /header>< main>< slot>< /slot>< /main>< footer>< slot name="footer">< /footer> < /div> 復制代碼父組件模板
< child-layout>< h1 slot="header">頁面標題< /h1>< p>主要內容< /p>< p slot="footer">一些信息< /p> < /child-layout> 復制代碼此時的渲染結果為:
< div class="container">< header>< h1>頁面標題< /h1>< /header>< main>< p>主要內容。< /p>< /main>< footer>< p>一些信息< /p>< /footer>復制代碼由于使用了具名插槽,也就是使用了slot的name屬性,使得父組件的內容被插到了子組件的指定位置。由于在子組件的main中使用了匿名slot,所以在父組件的模版中的p標簽也沒有用name屬性,所以就行默認配對,如果此時沒有匿名slot那么p標簽的內容將會被拋棄。
作用域插槽
作用域插槽是一種特殊類型的插槽,用作一個 (能被傳遞數據的) 可重用模板,來代替已經渲染好的元素。在子組件中,只需將數據傳遞到插槽,就像你將 prop 傳遞給組件一樣,例如在子組件中:
< div class="child">< slot data="data from child">< /slot> < /div> 復制代碼此時在父組件模版中,必須要有< template >元素存在,并且要使用特殊屬性slot-scope,以此表示它是作用域插槽的模板。slot-scope 的值將被用作一個臨時變量名,此變量接收從子組件傳遞過來的 prop 對象,比如現在有父組件:
< div class="parent">< child>< template slot-scope="props">< span>data from parent< /span>< span>{{ props.data }}< /span>< /template>< /child> < /div> 復制代碼此時渲染的結果是:
< div class="parent">< div class="child">< span>data from parent< /span>< span>data from child< /span>< /div> < /div> 復制代碼 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Vue的内容分发slot的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue组件插槽
- 下一篇: vue经验 - 细节小知识点汇总(更新中