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